javascript - Vuejs 指令绑定(bind)模型

标签 javascript vue.js jquery-select2

我正在使用 Vuejs 1.0 指令将选择字段(单个和多个)转换为 Select2 jQuery 插件字段。

Vue.directive('select2', {
    twoWay: true,
    priority: 1000,

    params: ['max-items'],

    bind: function () {
        var self = this;
        console.log(self.params);

        $(this.el)
            .select2({
                maximumSelectionLength: self.params.maxItems,
                theme: 'bootstrap',
                closeOnSelect: true
            })
            .on('change', function () {
                var i, len, option, ref, values;
                if (self.el.hasAttribute('multiple')) {
                    values = [];
                    ref = self.el.selectedOptions;
                    for (i = 0, len = ref.length; i < len; i++) {
                        option = ref[i];
                        values.push(option.value);
                    }
                    return self.set(values);
                } else {
                    return self.set(self.el.value);
                }
            })
    },
    update: function (value, oldValue) {
        $(this.el).val(value).trigger('change')
    },
    unbind: function () {
        $(this.el).off().select2('destroy')
    }
});

一切正常。我也在尝试将模型绑定(bind)到字段的值,但似乎无法正确绑定(bind)。

<select class="form-control" name="genre" v-model="upload.genre" v-select2="">
<option value="50">Abstract</option>
<option value="159">Acapella</option>
<option value="80">Acid</option>
...
</select>

upload.genre 属性不会自动更新。

最佳答案

v-model实际上是传递 prop 和更改事件设置值的语法糖,因此如下:

<input v-model="something">

相当于

<input v-bind:value="something" v-on:input="something = $event.target.value">

您也必须进行类似的更改,您可以在 select2 中看到此类型代码vue团队提供的示例。

  .on('change', function () {
    vm.$emit('input', this.value)
  })

使用 Vue 1.0

因为您使用的是 vue 1.0,所以有一个 two-way对于有助于将数据写回 Vue 实例的指令选项,您需要传入 twoWay: true。此选项允许在指令中使用 this.set(value):

Vue.directive('select2', {
  twoWay: true,
  bind: function () {
    this.handler = function () {
      // set data back to the vm.
      // If the directive is bound as v-select2="upload.genre",
      // this will attempt to set `vm.upload.genre` with the
      // given value.
      this.set(this.el.value)
    }.bind(this)
    this.el.addEventListener('input', this.handler)
  },
  unbind: function () {
    this.el.removeEventListener('input', this.handler)
  }
})

在 HTML 中:

<select class="form-control" name="genre" v-select2="upload.genre">

关于javascript - Vuejs 指令绑定(bind)模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244942/

相关文章:

c# - 更新标签中的文本

javascript - 如何根据 react-admin 中 BooleanInput 字段的状态动态显示或隐藏表单字段?

javascript - 如何在 javascript/vuejs 中复制对象

javascript - Vue.js:使用带有 v-for 的对象进行双向数据绑定(bind)

apache - 在 Apache 服务器中使用 vue js SPA 刷新页面时如何修复 "Not found "?

javascript - 如何替换 select2 默认微调器?

jquery - 如何使用 jquery 选择 select2 选择框的选项?

javascript - Jquery 函数不适用于选择表单

javascript - select2 没有滚动的太长列表使选择了错误的元素

javascript - 如何将引用 'this' 从 <a> 标记传递给 javascript 函数