【发布时间】:2018-04-22 09:11:24
【问题描述】:
我创建了一个自定义指令来处理 VueJs 中的 select2。当我将选择绑定到我的视图模型中的数据属性时,下面的代码有效,该属性不是数据中对象的属性。
像 this.userId 但如果它绑定到类似 this.user.id 的东西,它不会更新我的 viewmodel 数据对象中的值。
Vue.directive('selected', {
bind: function (el, binding, vnode) {
var key = binding.expression;
var select = $(el);
select.select2();
vnode.context.$data[binding.expression] = select.val();
select.on('change', function () {
vnode.context.$data[binding.expression] = select.val();
});
},
update: function (el, binding, newVnode, oldVnode) {
var select = $(el);
select.val(binding.value).trigger('change');
}
});
<select v-selected="userEditor.Id">
<option v-for="user in users" v-bind:value="user.id" >
{{ user.fullName}}
</option>
</select>
【问题讨论】:
-
你能分享一下这个的现场演示吗?
-
你为什么使用指令而不是自定义 Vue 组件?恕我直言,组件方式匹配更简单——你不需要使用这个 hack
vnode.context.$data,你也可以使用created、mounted钩子等。几周前,我在 Vue 中为一些 jquery 插件实现了包装器:我第一次使用指令方式 - 很快它变得太复杂了,所以我重构以分离 vue-component,现在它很简单并且工作正常。 -
对了,你看到这个原生的 vue-component-library:sagalbot.github.io/vue-select 了吗? - 我将它用于我的项目。它已经是 vue-component,所以不需要包装器。
-
另外,请提及这一刻:您使用
v-for表示没有:key属性的对象:<option v-for="user in users" v-bind:value="user.id" >。应该是这样的:<option v-for="user in users" v-bind:value="user.id" :key="user.id">(请参阅此文档:vuejs.org/v2/guide/list.html#key)。简而言之——如果你正在迭代对象,而不是原始类型——你可能会遇到 Vue 反应性的意外错误。 (我花了一整天的时间来找出我的项目中同样的遗漏)。 -
您可以使用 HTML select 元素并设置
is属性以使其成为 select2 组件。 vuejs.org/v2/api/#is
标签: javascript vue.js vuejs2 jquery-select2 vue-directives