Extjs5绑定标记字段

时间:2016-04-26 06:12:47

标签: mvvm extjs5

我有两个实体,User和Role,两者之间有很多ToMany关联。

然后我有一个显示用户列表的网格,右边是一个包含用户详细信息的表单,其中包含一个标记字段,用于显示和允许用户选择角色。

如果标记字段的绑定设置为

bind: {
          store: '{roles}',
          value: '{mainGrid.selection.roles}'
       }

然后它不显示用户已经拥有的角色并抛出:

  

“未捕获的TypeError:parentData [association.setterName]不是函数”

当试图设置用户角色时

所以我也尝试将tagfield值绑定到像

这样的公式
bind: {
         store: '{roles}',
         value: '{userRoles}'
      }

并且标记字段显示所选用户的角色,但我不知道如何将所选角色设置回用户实体。

我的模特是:

Ext.define('App.model.security.User', {
    extend: 'App.model.Base',

    entityName: 'User',

    fields: [
        { name: 'id' },
        { name: 'email'},
        { name: 'name'},
        { name: 'enabled', type: 'bool'}
    ],

    manyToMany: {
        UserRoles: {
            type: 'Role',
            role: 'roles',
            field: 'id',
            right: {
                field: 'id',
                role: 'users'
            }
        }
    }
});

Ext.define('App.model.security.Role', {
    extend: 'App.model.Base',

    entityName: 'Role',

    fields: [
        { name: 'id' },
        { name: 'name'},
        { name: 'enabled', type: 'bool'}
    ],

    manyToMany: {
        RoleUsers: {
            type: 'User',
            role: 'users',
            field: 'id',
            right: {
                field: 'id',
                role: 'roles'
            }
        }
    }
});

标记字段定义:

    xtype: 'tagfield',
    fieldLabel: 'Roles',
    displayField: 'name',
    valueField: 'id',
    stacked: true,
    multiSelect: true,
    filterPickList: true,
    queryMode: 'local',
    publishes: 'value',
    bind: {
        store: '{roles}',
        value: '{userRoles}'
    }

和ViewModel:

Ext.define('App.view.security.user.UsersModel', {
    extend: 'Ext.app.ViewModel',

    alias: 'viewmodel.users',

    stores: {
        users: {
            model: 'App.model.security.User',
            pageSize: 15,
            autoLoad: true,
            session: true
        },
        roles: {
            model: 'App.model.security.Role',
            autoLoad: true,
            session: true
        }
    },

    formulas: {
        userRoles: {
            bind: {
                bindTo: '{mainGrid.selection.roles.data.items}',
                deep: true
            },

            get: function(value){
                return value;
            },

            set: function(value){
            }
       }
    }
});

这是我与Ext的第一个项目,所以也许我在模型协会缺少一些配置,我不知道。 我已经google了很多,但缺乏有关链接标记字段的信息。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,我最后通过完成缺少的setter代码来使用公式:

           set: function(values){
                //Delete the roles that were not established
                var del = [], noadd = [];
                var roles = this.get('mainGrid').selection.roles();
                roles.each(function(record){
                    if (values.indexOf(record.get('id')) == -1) {
                        del.push(record);
                    }
                    else {
                        noadd.push(record.get('id'));
                    }
                });
                del.forEach(function(record){
                    roles.remove(record);
                });

                //Add the roles that didn't exist
                var store = this.getStore('roles');
                var allRecords = store.getData().getSource() || store.getData();
                allRecords.each(function(record){
                    if (values.indexOf(record.get('id')) != -1 && noadd.indexOf(record.get('id')) == -1) {
                        roles.add(record);
                    }
                });
            }

我正在使用的那些数组是因为:

(del)无法循环和删除我正在循环的同一个集合

(noadd)如果我尝试将现有记录添加到角色集合中,它将不会被添加两次,但在保存时,现有记录奇怪地显示为创建,我认为这是一个BUG。

我会暂时搁置这个问题,所以如果你知道一个更好的解决方法,你可以做出贡献。

谢谢!