关联模型在通过代理更新时没有从嵌套JSON更新



在我的Ext JS 4.1应用程序中,我有一个模型ProjectbelongsTo关联到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)调用,它将跳过通知存储/代理有关更改。

最新更新