有一个很好的examples of integrating vue with select2。
我有一个问题。
如果我们看一下代码的这一部分:
mounted: function () {
var vm = this
$(this.$el)
// init select2
.select2({ data: this.options })
.val(this.value)
.trigger('change')
// emit event on change.
.on('change', function () {
vm.$emit('input', this.value)
})
}
我不明白,为什么当我们改变select2的值时,this.value也会改变。 我期待一个像以下的记录:
.on('change', function () {
this.value = $(this.$el).val()
vm.$emit('input', this.value)
})
答案 0 :(得分:2)
由于v-model
的工作方式,它的行为方式如此。您所看到的是双向绑定。如果selected
中v-model="selected"
的值发生更改,则该值将下推到该组件。
当调用vm.$emit('input', this.value)
时,它会告诉父级更新正在侦听更改的变量,在这种情况下selected
,它将被推回到组件,以使其值得到更改。
为了使其更容易理解,这是一系列事件:
selected
selected
好问题。
警告:这样做可以理解为糟糕的做法。当与单向绑定一起使用时,它会破坏它。答案 1 :(得分:1)
注意模板中select2
组件的使用方式:
<select2 :options="options" v-model="selected">
<option disabled value="0">Select one</option>
</select2>
在使用v-model
的Vue.js中,组件可以简化为:
<your-component
:value="selected"
@input="value => { selected = value }">
</your-component>
因此,每次从组件中发出事件时,都会在父组件处更改值。
答案 2 :(得分:1)
在写完我之前的答案之后,我意识到我错过了一些重要的事情:上下文。
在jsfiddle的第5行,有这一行:
var vm = this
,为什么?
这是因为稍后,在执行vm.$emit
时,this.$emit
将无效;背景已经改变。
.on('change', function () {
//this = select2 element
vm.value // == 1
this.value // == 2
vm.$emit("input", this.value);
})
emit事件的值不是组件的值,而是select2
元素的值。
虽然组件上尚未更改value
,但新值已广播给父母。