我使用Vue.js 2.0和元素UI库。
我想使用多选一些角色属性我的用户。
收到所有可用角色的列表,并分配给availableRoles
。 因为它是对象的一个阵列和v-model
只接受一个阵列值,我需要提取id
的角色的槽所计算的属性computedRoles
。
我的用户的当前角色被接收并分配给userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}]
computedRoles
然后等于[1,3]
选择的预选是好的,但我不能改变什么(添加或选择删除选项)
什么是错的,如何解决呢?
http://jsfiddle.net/3ra1jscx/3/
<div id="app">
<template>
<el-select v-model="computedRoles" multiple placeholder="Select">
<el-option v-for="item in availableRoles" :label="item.name" :value="item.id">
</el-option>
</el-select>
</template>
</div>
var Main = {
data() {
return {
availableRoles: [{
id: 1,
name: 'Admin'
}, {
id: 2,
name: 'Power User'
}, {
id: 3,
name: 'User'
}],
userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}]
}
},
computed : {
computedRoles () {
return this.userRoles.map(role => role.id)
}
}
}
我同意大多与@wostex的答案,但他不给你userRoles
属性回来。 基本上你应该换computedRoles
和userRoles
。 userRoles
成为计算属性和computedRoles
是数据属性。 在我的更新,我改的名字computedRoles
到selectedRoles
。
var Main = {
data() {
return {
availableRoles: [{
id: 1,
name: 'Admin'
}, {
id: 2,
name: 'Power User'
}, {
id: 3,
name: 'User'
}],
selectedRoles:[1,2]
}
},
computed : {
userRoles(){
return this.availableRoles.reduce((selected, role) => {
if (this.selectedRoles.includes(role.id))
selected.push(role);
return selected;
}, [])
}
}
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
这里是小提琴 。
检查解决方案: 的jsfiddle
这里需要说明的是,计算性能主要干将。 您可以定义setter方法计算的属性,但我的做法是更VUE般的在我看来。
在短的代替, v-model
上计算集合v-model
数据属性。
全码:
<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui/lib/index.js"></script>
<div id="app">
<template>
<el-select v-model="ids" multiple placeholder="Select" @change="logit()">
<el-option v-for="item in availableRoles" :label="item.name" :value="item.id">
</el-option>
</el-select>
</template>
</div>
var Main = {
data() {
return {
availableRoles: [{
id: 1,
name: 'Admin'
}, {
id: 2,
name: 'Power User'
}, {
id: 3,
name: 'User'
}],
userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}],
ids: []
}
},
mounted() {
this.ids = this.userRoles.map(role => role.id);
},
methods: {
logit: function() {
console.log(this.ids);
}
}
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')