1

私の Ext JS 4.1 アプリケーションには、以下に関連付けられたモデルProjectがあります。belongsToProjectCategory

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') : '';
}

ただし、 を使用して親Projectレコードを編集および保存する場合、関連するレコードのフィールドは、 「ネイティブ」フィールドform.updateRecord(record)とは異なり、サーバーの応答からの値で更新されません。Projectしたがって、 を変更すると、サーバーが新しいカテゴリを含むproject_category_id正しくネストされたフィールドで応答しても、古いカテゴリが返されます。ProjectCategorygetCategory

これがサーバーの応答から更新されないのはなぜですか?更新するにはどうすればよいですか?

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 に答える