Vuejs 指令绑定模型
Vuejs directive binding a model
我正在使用 Vuejs 1.0 指令将 select 字段(单个和多个)转换为 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')
}
});
一切正常。我也在尝试将模型绑定到字段的值,但似乎无法正确绑定。
<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">
你也要做类似的修改,你可以在vue团队提供的select2示例中看到这个类型代码。
.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">
我正在使用 Vuejs 1.0 指令将 select 字段(单个和多个)转换为 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')
}
});
一切正常。我也在尝试将模型绑定到字段的值,但似乎无法正确绑定。
<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">
你也要做类似的修改,你可以在vue团队提供的select2示例中看到这个类型代码。
.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">