私は extjs 4.1.1 のマスタースレーブ詳細ページに取り組んでいます。
多くの Address モデルを持つ Person モデルがあります。(EXTJS で関係を構成しました)
すべての人のレコードを表示するグリッドがあり、レコードをクリックすると、この人の関連する住所が別のグリッドに表示されます。
私が使用する2番目のグリッドを設定するには:
var grid2 = this.getAddressList(); //made a reference to this
var store = record.Addresses(); // this gives me the addresses store associated with the person record
...
grid2.reconfigure(store);
個人のアドレス ストアにアドレスを追加すると、残りのサーバーに対して ajax リクエストが送信されます。extjs が関連データもサーバーに送信することを確認するために、特別なライター クラス (extjs フォーラムのコード) を作成しました。
Ext.define('Ext.data.writer.DeepJson', {
extend:'Ext.data.writer.Json',
getRecordData:function (record, operation) {
var isPhantom = record.phantom === true,
writeAll = this.writeAllFields || isPhantom,
nameProperty = this.nameProperty,
fields = record.fields,
data = {},
changes,
name,
field,
key;
if (writeAll) {
// This is the branch that has been changed from the original Json Writer
data = record.getData(true);
} else {
changes = record.getChanges();
for (key in changes) {
if (changes.hasOwnProperty(key)) {
field = fields.get(key);
name = field[nameProperty] || field.name;
data[name] = changes[key];
}
}
}
if (isPhantom) {
if (operation && operation.records.length > 1) {
data[record.clientIdProperty] = record.internalId;
}
} else {
data[record.idProperty] = record.getId();
}
return data;
}
});
サーバー側では、データベースを更新するだけで、extjs がフロント エンドを更新できるように、関連付けられたアドレスを json オブジェクトに入れた人物が返されます。
問題は、extjs は人物グリッドのみを更新でき、住所グリッドは更新できないことです。サーバーが更新されたバージョンのレコードで応答した場合でも、新しく作成されたアドレス レコードはダーティとしてマークされたままになります (サーバーはそれに ID を与えます)。
似たようなことに遭遇したことがあり、アドバイスを提供できる人はいますか? 多くのコードを提供していないことに気づきましたが、もっと共有したいと思っています。必要な部分がわかりません。
編集 MyStore.load() を使用してデータをグリッドにロードしますストアには、次のように構成されたレストプロキシがあります。
proxy:
{
type: 'rest',
url: 'persons', //general read url
headers : auth, //basic auth to connect to rest service
reader:
{
type: 'json',
root: 'persons',
successProperty: 'renderList'
},
writer:Ext.create('Ext.data.writer.DeepJson', {root: 'persons'}), //above writer class
api:
{
update: 'persons/person',
create: 'persons/person',
destroy: 'persons/person'
},
}