1

在我的 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']
});

该项目通过直接代理读取,并且 ProjectCategory 详细信息作为嵌套值包含在响应中(主要用于显示目的)。加载商店时,相关数据被正确读取,我可以ProjectCategory通过自定义渲染器读取网格中的标题:

renderer: function(v, p, rec) {
  return v ? rec.getCategory().get('title') : '';
}

但是,当通过 编辑和保存父Project记录时form.updateRecord(record),关联记录的字段不会使用来自服务器响应的值进行更新,这与Project的“本机”字段不同。因此,在更改 时project_category_id,即使服务器将使用ProjectCategory包含新类别的正确嵌套字段进行响应,getCategory仍将返回旧类别。

为什么这不是从服务器响应中更新的,我该怎么做才能更新它?

我已经发现在商店的write监听器中,我可以访问记录和返回的关联数据。但我不知道如何在不触发任何其他事件的情况下静默更新记录。

4

1 回答 1

2

好像我找到了我的解决方案。将此添加到Project商店:

listeners: {
  write: function(store, operation, opt) {
    var c = operation.records[0].getCategory();
    c.set(operation.response.result.ProjectCategory);
    c.commit(true);
  }
}

关键元素是commit(true)调用,它将跳过通知存储/代理有关更改。

不过,这不是自动完成的,这仍然是一个遗憾。

于 2013-03-05T16:37:56.947 回答