最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

vue.js - Calling a javascript function inside a vue component file - Stack Overflow

programmeradmin3浏览0评论

I have a simple ponent file to submit a form, and I have a javascript function to perform an action:

<template>
    <div>
       <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">×</button>
            <h4 class="modal-title">Create Job</h4>
        </div>
        <div class="modal-body">
            <form method="post" @submit.prevent="signIn" @keydown="errors.clear($event.target.name)">
                <div class="form-group">
                    <label>Job Name</label>
                    <input type="text" class="form-control" placeholder="Web Developer" v-model="name">
                    <span v-text="errors.get('name')" class="text-danger help-block"></span>
                </div>

                <div class="form-group">
                    <label>Job Summary</label>
                    <textarea class="form-control" v-model="summary"></textarea>
                    <span v-text="errors.get('summary')" class="text-danger help-block"></span>
                </div>

                <div class="form-group">

                    <div class="col-sm-6" style="padding-left: 0px;">
                        <label>Salary Type</label>
                        <select class="form-control" v-model="salarytype">
                            <option value="">Select an option</option>
                            <option value="hourly">Hourly</option>
                            <option value="weekly">Weekly</option>
                            <option value="fortnightly">Fortnightly</option>
                            <option value="monthly">Monthly</option>
                        </select>
                        <span v-text="errors.get('salarytype')" class="text-danger help-block"></span>
                    </div>

                    <label>Salary</label>               
                    <div class="col-sm-6 input-group">
                        <input type="number" v-model="salaryfrom" class="form-control" placeholder="24,000"">
                        <span class="input-group-addon">-</span>
                        <input type="number" v-model="salaryto" class="form-control" placeholder="34,000">
                        <span v-text="errors.get('salaryfrom')" class="text-danger help-block"></span>
                        <span v-text="errors.get('salaryto')" class="text-danger help-block"></span>
                    </div>
                </div>

                <div class="form-group col-sm-6" style="padding:0px;">
                    <label>Job Location</label><br/>
                    <select class="form-control" v-model="location" @change="onChange($event.target.value)">  
                        <option>Select an option</option>
                        <option v-for="(value, key) in countries" :value="key">{{ value }}</option>
                    </select>
                    <span v-text="errors.get('location')" class="text-danger help-block"></span>
                </div>

                <div class="form-group col-sm-6">
                    <label>Contact Details</label>
                    <input type="email" v-model="contactemail" class="form-control" placeholder="John Doe">
                    <span v-text="errors.get('contactemail')" class="text-danger help-block"></span>
                </div>

                <label>Contact Number</label>   
                <div class="form-group input-group">
                    <span class="input-group-addon">
                        <i class="fa fa-phone"></i>
                    </span>
                    <input type="tel" v-model="contactphone" class="form-control" placeholder="+4407584457483">
                    <span v-text="errors.get('contactphone')" class="text-danger help-block"></span>
                </div>
            </form>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-info btn-fill btn-wd" v-on:click="addJob">Save</button>
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
    </div>
</template>

<script>

    class Errors
    {
        constructor()
        {
            this.errors = {};
        }

        get(field){
            if(this.errors[field]){
                return this.errors[field][0]
            }
        }

        any(){
            console.log(Object.keys(this.errors).length);
            return Object.keys(this.errors).length > 1;
        }

        record(errors){
            this.errors = errors;
        }

        clear(field){
            delete this.errors[field];
        }
    }

    export default
    {
        data: function () 
        {
            return {
                countries: [],
                name: '',
                summary: '',
                salarytype: '',
                salaryfrom: '',
                salaryto: '',
                location: '',
                contactemail: '',
                contactphone: '',
                errors: new Errors()
            }
        },

        methods: 
        {
            addJob: function()
            {
                axios.post('/jobs/create', this.$data)
                .then(response => {
                    if(response.data.status === true){
                        $('#createJob').modal('hide');
                        getJobTable();
                    }
                    else{
                        formError = response.data.message;
                    }
                })
                .catch(error => this.errors.record(error.data))
            }
        },

        mounted: function()
        {
            axios.get('/countries')
                .then(response => {
                    this.countries = response.data;
                })
        }
    }
</script>

My js file in a file that is rendering the ponent vue file:

<script>
    $(function() {
        var getJobTable = function(){
            console.log('dt triggered');
            $('#all-jobs').DataTable({
                processing: true,
                serverSide: true,
                ajax: '{!! route('job.datatable.usersjobs') !!}',
                columns: [
                    { data: 'name', name: 'name' },
                    { data: 'summary', name: 'summary' },
                    { data: 'status', name: 'status' },
                    { data: 'applications', name: 'applications' },
                    { data: 'action', name: 'action' },
                ],
                initComplete: function () {
                    this.api().columns().every(function () {
                        var column = this;
                        var input = document.createElement("input");
                        $(input).appendTo($(column.footer()).empty())
                        .on('change', function () {
                            column.search($(this).val(), false, false, true).draw();
                        });
                    });
                }
            });
        }
        getJobTable();
    });
</script>

How can I access getJobTable(); inside my ponent file?

I have a simple ponent file to submit a form, and I have a javascript function to perform an action:

<template>
    <div>
       <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">×</button>
            <h4 class="modal-title">Create Job</h4>
        </div>
        <div class="modal-body">
            <form method="post" @submit.prevent="signIn" @keydown="errors.clear($event.target.name)">
                <div class="form-group">
                    <label>Job Name</label>
                    <input type="text" class="form-control" placeholder="Web Developer" v-model="name">
                    <span v-text="errors.get('name')" class="text-danger help-block"></span>
                </div>

                <div class="form-group">
                    <label>Job Summary</label>
                    <textarea class="form-control" v-model="summary"></textarea>
                    <span v-text="errors.get('summary')" class="text-danger help-block"></span>
                </div>

                <div class="form-group">

                    <div class="col-sm-6" style="padding-left: 0px;">
                        <label>Salary Type</label>
                        <select class="form-control" v-model="salarytype">
                            <option value="">Select an option</option>
                            <option value="hourly">Hourly</option>
                            <option value="weekly">Weekly</option>
                            <option value="fortnightly">Fortnightly</option>
                            <option value="monthly">Monthly</option>
                        </select>
                        <span v-text="errors.get('salarytype')" class="text-danger help-block"></span>
                    </div>

                    <label>Salary</label>               
                    <div class="col-sm-6 input-group">
                        <input type="number" v-model="salaryfrom" class="form-control" placeholder="24,000"">
                        <span class="input-group-addon">-</span>
                        <input type="number" v-model="salaryto" class="form-control" placeholder="34,000">
                        <span v-text="errors.get('salaryfrom')" class="text-danger help-block"></span>
                        <span v-text="errors.get('salaryto')" class="text-danger help-block"></span>
                    </div>
                </div>

                <div class="form-group col-sm-6" style="padding:0px;">
                    <label>Job Location</label><br/>
                    <select class="form-control" v-model="location" @change="onChange($event.target.value)">  
                        <option>Select an option</option>
                        <option v-for="(value, key) in countries" :value="key">{{ value }}</option>
                    </select>
                    <span v-text="errors.get('location')" class="text-danger help-block"></span>
                </div>

                <div class="form-group col-sm-6">
                    <label>Contact Details</label>
                    <input type="email" v-model="contactemail" class="form-control" placeholder="John Doe">
                    <span v-text="errors.get('contactemail')" class="text-danger help-block"></span>
                </div>

                <label>Contact Number</label>   
                <div class="form-group input-group">
                    <span class="input-group-addon">
                        <i class="fa fa-phone"></i>
                    </span>
                    <input type="tel" v-model="contactphone" class="form-control" placeholder="+4407584457483">
                    <span v-text="errors.get('contactphone')" class="text-danger help-block"></span>
                </div>
            </form>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-info btn-fill btn-wd" v-on:click="addJob">Save</button>
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
    </div>
</template>

<script>

    class Errors
    {
        constructor()
        {
            this.errors = {};
        }

        get(field){
            if(this.errors[field]){
                return this.errors[field][0]
            }
        }

        any(){
            console.log(Object.keys(this.errors).length);
            return Object.keys(this.errors).length > 1;
        }

        record(errors){
            this.errors = errors;
        }

        clear(field){
            delete this.errors[field];
        }
    }

    export default
    {
        data: function () 
        {
            return {
                countries: [],
                name: '',
                summary: '',
                salarytype: '',
                salaryfrom: '',
                salaryto: '',
                location: '',
                contactemail: '',
                contactphone: '',
                errors: new Errors()
            }
        },

        methods: 
        {
            addJob: function()
            {
                axios.post('/jobs/create', this.$data)
                .then(response => {
                    if(response.data.status === true){
                        $('#createJob').modal('hide');
                        getJobTable();
                    }
                    else{
                        formError = response.data.message;
                    }
                })
                .catch(error => this.errors.record(error.data))
            }
        },

        mounted: function()
        {
            axios.get('/countries')
                .then(response => {
                    this.countries = response.data;
                })
        }
    }
</script>

My js file in a file that is rendering the ponent vue file:

<script>
    $(function() {
        var getJobTable = function(){
            console.log('dt triggered');
            $('#all-jobs').DataTable({
                processing: true,
                serverSide: true,
                ajax: '{!! route('job.datatable.usersjobs') !!}',
                columns: [
                    { data: 'name', name: 'name' },
                    { data: 'summary', name: 'summary' },
                    { data: 'status', name: 'status' },
                    { data: 'applications', name: 'applications' },
                    { data: 'action', name: 'action' },
                ],
                initComplete: function () {
                    this.api().columns().every(function () {
                        var column = this;
                        var input = document.createElement("input");
                        $(input).appendTo($(column.footer()).empty())
                        .on('change', function () {
                            column.search($(this).val(), false, false, true).draw();
                        });
                    });
                }
            });
        }
        getJobTable();
    });
</script>

How can I access getJobTable(); inside my ponent file?

Share Improve this question edited Jun 25, 2017 at 15:01 Michail Michailidis 12.2k6 gold badges69 silver badges109 bronze badges asked Jun 25, 2017 at 11:27 user4655002user4655002
Add a ment  | 

2 Answers 2

Reset to default 7

You could take the definition of getJobTable out of the jquery wrapper and leave only the call inside, that way you could access getJobTable from anywhere.

var getJobTable = function() {
  // ...
}

// ...

$(function() {
  getJobTable();
})

//...

methods: {
  addjob: function() {
    // ...
    getJobTable();
  }
}

Like in this pen

You can declare getJobTable() function as global so your script inside vue ponent can see it,

on your external JS code:

Window.getJobTable = function() {// ...}

on your Vuejs ponent:

 methods: { 
   addjob: function() {
     // ...
     Window.getJobTable();
   }
}
发布评论

评论列表(0)

  1. 暂无评论