vue2js - 如何在指令中使用选定的 select 值传播 selected 索引
vue2js - how to propagate selected index with chosen select value in a direcitve
请看下面的代码。第一个 select 框是用 chosen js 创建的。更改后,它应将其更改后的值传播到其绑定的模型 (cityid
)。第二个普通 select 框工作正常,它的值被传播。
Vue.directive('chosen', {
bind: function (el, binding, vnode, oldVnode) {
Vue.nextTick(function() {
$(el).chosen({
width:'100%'
}).change(function(){
alert($(el).val());
vnode.context.$emit('input', $(el).val());
});
});
},
update: function(el, binding, vnode, oldVnode) {
}
});
new Vue({
el : '#app',
data:{
cityid : 3,
cities : [
{id:1, value:'London'},
{id:2, value:'Newyork'},
{id:3, value:'Delhi'}
]
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script>
<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://harvesthq.github.io/chosen/chosen.jquery.js"></script>
<link rel="stylesheet" href="https://harvesthq.github.io/chosen/chosen.css" >
<div id="app">
selected city id # {{ cityid }}
<hr>
<select v-chosen v-model="cityid">
<option v-for="option in cities" :value="option.id" >{{option.value}}</option>
</select>
<hr>
<select v-model="cityid">
<option v-for="option in cities" :value="option.id" >{{option.value}}</option>
</select>
</div>
当您在指令中发出时,您是从根节点(context
)发出事件。您需要从节点本身发出事件。您无权访问 $emit 事件,但可以检查已附加到节点的处理程序。在这种情况下,v-model
正在应用 change
处理程序。因此,如果您这样编写指令,您的代码应该可以工作。
Vue.directive('chosen', {
bind: function (el, binding, vnode, oldVnode) {
Vue.nextTick(function() {
$(el).chosen({
width:'100%'
}).change(function(e){
vnode.data.on.change(e, $(el).val())
});
});
}
});
这是一个example.
请看下面的代码。第一个 select 框是用 chosen js 创建的。更改后,它应将其更改后的值传播到其绑定的模型 (cityid
)。第二个普通 select 框工作正常,它的值被传播。
Vue.directive('chosen', {
bind: function (el, binding, vnode, oldVnode) {
Vue.nextTick(function() {
$(el).chosen({
width:'100%'
}).change(function(){
alert($(el).val());
vnode.context.$emit('input', $(el).val());
});
});
},
update: function(el, binding, vnode, oldVnode) {
}
});
new Vue({
el : '#app',
data:{
cityid : 3,
cities : [
{id:1, value:'London'},
{id:2, value:'Newyork'},
{id:3, value:'Delhi'}
]
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script>
<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://harvesthq.github.io/chosen/chosen.jquery.js"></script>
<link rel="stylesheet" href="https://harvesthq.github.io/chosen/chosen.css" >
<div id="app">
selected city id # {{ cityid }}
<hr>
<select v-chosen v-model="cityid">
<option v-for="option in cities" :value="option.id" >{{option.value}}</option>
</select>
<hr>
<select v-model="cityid">
<option v-for="option in cities" :value="option.id" >{{option.value}}</option>
</select>
</div>
当您在指令中发出时,您是从根节点(context
)发出事件。您需要从节点本身发出事件。您无权访问 $emit 事件,但可以检查已附加到节点的处理程序。在这种情况下,v-model
正在应用 change
处理程序。因此,如果您这样编写指令,您的代码应该可以工作。
Vue.directive('chosen', {
bind: function (el, binding, vnode, oldVnode) {
Vue.nextTick(function() {
$(el).chosen({
width:'100%'
}).change(function(e){
vnode.data.on.change(e, $(el).val())
});
});
}
});
这是一个example.