Vue 指令不更新它的值 - Jquery Selected



我正在使用Jquery Selected和Vue。这是我的 Vue 指令:

Vue.component("chosen-select", {
    props: {
        value: [String, Array],
        multiple: Boolean
    },
    template: `<select :multiple="multiple"><slot></slot></select>`,
    mounted() {
        $(this.$el)
            .val(this.value)
            .chosen({ width: '100%' })
            .on("change", e => this.$emit('input', $(this.$el).val()))
    },
    watch: {
        value(val) {
            $(this.$el).val(val).trigger('chosen:updated');
        }
    },
    destroyed() {
        $(this.$el).chosen('destroy');
    }
});

并像这样使用它:

<chosen-select v-model="basicDetailsModel.stateID" v-validate="'required'" data-vv-as="state" :state="errors.has('stateID') ? 'invalid' : 'valid'" name="stateID">
                        <option :value="null">Please select an option</option>
                        <option v-for="(state, index) in states" :key="index" :value="state.sid">{{state.nm}}</option>
                    </chosen-select>

如果状态被分配了静态值,它按照预期工作正常,但是如果我动态获取状态值,则所选值不会使用最新值更新。它保持初始值。

我将如何解决此问题?

编辑:这个有效。你认为这是正确的方法吗?

Vue.component("chosen-select", {
    data() {
        return { observer: null }
    },
    props: {
        value: [String, Array],
        multiple: Boolean
    },
    template: `<select :multiple="multiple"><slot></slot></select>`,
    mounted() {
        // Create the observer (and what to do on changes...)
        this.observer = new MutationObserver(function (mutations) {
            $(this.$el).trigger("chosen:updated");
        }.bind(this));
        // Setup the observer
        this.observer.observe(
            $(this.$el)[0],
            { childList: true }
        );
        $(this.$el)
            .val(this.value)
            .chosen({ width: '100%' })
            .on("change", e => this.$emit('input', $(this.$el).val()))
    },
    watch: {
        value(val) {
            $(this.$el).val(val);
        }
    },
    destroyed() {
        $(this.$el).chosen('destroy');
    }
});

解决此问题的最简单方法是在有使用 v-if 进行渲染的选项之前不渲染选择。

<chosen-select v-if="states && states.length > 0" v-model="basicDetailsModel.stateID" v-validate="'required'" data-vv-as="state" :state="errors.has('stateID') ? 'invalid' : 'valid'" name="stateID">

您还可以尝试在组件更新时发出 chosen:updated 事件。

updated(){
  $(this.$el).trigger("chosen:updated")
},

它适用于多个选择,但神秘地不适用于单个选择。

我不确定您如何动态获取状态,但是如果您使用 jQuery 来获取它们,那么我认为这就是您的问题。如果非 Vue 的东西(如 jQuery(改变了任何东西,Vue 不会收到通知。即使不是这样,这也值得一读,看看为什么jQuery和Vue相处不好。您能否添加如何动态获取它们?另外,考虑使用像 Vuetify 这样的 Vue 框架,它有一个非常好的选择控制,并且完全在 Vue 中。

最新更新