多个选择Vue.js和计算属性

时间:2017-04-05 20:36:56

标签: javascript vuejs2

我正在使用Vue.js 2.0和Element 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)
        }
    }
  }

2 个答案:

答案 0 :(得分:1)

检查解决方案:jsfiddle

这里需要注意的是,计算属性主要是getter。你可以为计算属性定义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')

答案 1 :(得分:1)

我主要同意@wostex的回答,但他并没有给你userRoles财产。基本上你应该交换computedRolesuserRolesuserRoles成为计算属性,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')

这是fiddle