Vue组件未加载值

时间:2020-05-04 05:50:23

标签: vue.js jquery-select2

我有一个使用JS的Vue应用。除其他外,我需要使用一些Select2来动态加载值。我为Select2制作了一个Vue组件,除了一个问题外,它的运行效果非常好。我正在使用Ajax获取Select2的动态选项,但是在安装我的Select2时,它没有为Ajax URL加载值。这是我的代码:

<template>
    <table class="table">
        <thead>
        <tr>
            <th>Substance</th>
            <th>Tested</th>
            <th>Results</th>
            <th>Cause of Death</th>
            <th>Person Perscribed For</th>
            <th>Category</th>
            <th></th>
        </tr>
        </thead>
        <tbody>
        <tr v-for="index in SubstanceRows" :key="index">
            <td><input type="text" class="form-control form-control-sm substance-row" /></td>
            <td><select2 class="js-example-basic-single tested-row" :apiurl="SummaryTested" style="width: 100%;"></select2></td>
            <td><select2 class="js-example-basic-single result-row" :apiurl="SummaryResult" style="width: 100%;"></select2></td>
            <td><div class="form-check"><input type="checkbox" class="form-check-input cause-of-death-row" value=""></div></td>
            <td><select2 class="js-example-basic-single obtained-for-row" :apiurl="DrugObtainedFor" style="width: 100%;"></select2></td>
            <td><div class="form-check"><input type="text" class="form-control form-control-sm category-row" /></div></td>
        </tr>
        </tbody>
    </table>
</template>
<script type="text/x-template" id="select2-template">
  <select>
    <slot></slot>
  </select>
</script>

这是我的组件:

Vue.component('select2', {
    props: ['apiurl', 'id'],
    template: '#select2-template',
    mounted: function(){
        this.loadSelect2
    },
    watch: {
        loadSelect2: function() {
            var vm = this
            var apiURL = this.apiurl
            $(this.$el).select2({
                placeholder: "Select an option",
                allowClear: true,
                templateResult: dropdownTemplate,
                templateSelection: dropSelection,
                ajax: {
                    url: function(params){
                        url = 'api/variable/' + apiURL
                        if(params.term) url = 'api/variable/' + apiURL + '/' + params.term
                        return url
                    }
                }
            })
            //Check if it has a value assigned
            if (vm.$root[apiURL] && vm.$root[apiURL] != ''){
                $.ajax({
                    type: 'GET',
                    url: '/api/variable/' + apiURL + '/' + vm.$data[apiURL]
                }).then(function(data) {
                    var option = new Option(data.results[0].label, data.results[0].id, true, true)
                    element.append(option).trigger('change')
                    element.trigger({
                        type: 'select2:select',
                        params: {
                            data: data.results
                        },
                        templateResult: dropdownTemplate,
                        templateSelection: dropSelection
                    })
                })
            }
        }
    }
})

卡住的地方是,正如您看到的(或没有看到的),我正在使用v-for生成这些字段,并使用了在Vue应用程序中声明的变量。我有一个按钮,可以根据需要添加更多的按钮(目前,我只向变量添加了+1)。我遇到的问题是为select2做ajax时。说/api/variable + apiURL的部分,在首次生成时,未定义变量apiURL。我应该提到v-for变量SubstanceRows的初始值为3(因此加载时我有三行)。但是,当我使用按钮添加一行时,它可以正常工作,并且按预期方式加载了url。我猜这是异步的问题,但是我真的对Vue没有足够的经验来弄清楚它是什么。

此外,脚本部分id=select2-template遵循了指南,但我不知道它的作用。

3 个答案:

答案 0 :(得分:1)

您是否尝试过将loadSelect2函数从watch移到methods? 据我所知,手表是用来听道具的。观看道具是否有来自父组件的数据更新。

所以会是这样:

    mounted: function(){
        this.loadSelect2();
    },
    methods: {
        loadSelect2: function() {
            var vm = this
            var apiURL = this.apiurl

           // the rest of the code

        }

答案 1 :(得分:0)

这是因为您在props方法中没有propsDatamounted,它们只是稍后出现的。放一样。监视程序中的函数,以便在apiUrl更改值(接收到非null / undefined值)时,您可以调用该函数。

答案 2 :(得分:0)

当您调用var apiURL = this.apiURL错误时。您的道具全部为小写字母,而不是var apiUrl = this.apiurl