在我的Ext JS 4.1应用程序中,我有一个模型Project
与belongsTo
关联到ProjectCategory
:
Ext.define('MyApp.model.Project', {
extend: 'Ext.data.Model',
fields: ['id', 'project_category_id', 'title'],
belongsTo: {
model: 'MyApp.model.ProjectCategory',
associationKey: 'ProjectCategory',
getterName: 'getCategory'
}
// ...
});
Ext.define('MyApp.model.ProjectCategory', {
extend: 'Ext.data.Model',
fields: ['id', 'title']
});
通过Direct代理读取项目,ProjectCategory详细信息作为嵌套值包含在响应中(主要是为了显示目的)。加载存储时,可以正确读取相关数据,并且可以通过自定义渲染器在网格中读取ProjectCategory
的标题:
renderer: function(v, p, rec) {
return v ? rec.getCategory().get('title') : '';
}
然而,当通过form.updateRecord(record)
编辑和保存父Project
记录时,与Project
的"本地"字段不同,相关记录的字段不会使用来自服务器响应的值更新。因此,当更改project_category_id
时,即使服务器将响应包含新类别的正确嵌套的ProjectCategory
字段,getCategory
仍将返回旧类别。
为什么这不是从服务器响应更新,我必须做些什么来更新它?
我已经发现,在商店的write
侦听器中,我可以访问记录和返回的关联数据。但是我不知道如何在不触发任何其他事件的情况下默默地更新记录。
看来我找到解决办法了。将此添加到Project
存储:
listeners: {
write: function(store, operation, opt) {
var c = operation.records[0].getCategory();
c.set(operation.response.result.ProjectCategory);
c.commit(true);
}
}
关键元素是commit(true)
调用,它将跳过通知存储/代理有关更改。