我有两个实体,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了很多,但缺乏有关链接标记字段的信息。 任何帮助将不胜感激。
答案 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。
我会暂时搁置这个问题,所以如果你知道一个更好的解决方法,你可以做出贡献。
谢谢!