アプリケーション EmployeesTree、Empolyees、History に 3 つのストアがあります。1 つ目は treegrid のソースで、2 つ目は 3 つ目の stode をロードする際に追加のパラメーターを渡すために使用されるコンボボックスのソースです。
私の最初のアプローチは、標準プロキシを使用して 2 番目のストアを作成し、リクエストを使用してサーバーから従業員をロードすることでした。
私の履歴グリッドには次のものがあります。
me.c = Ext.create("MyApp.Store.Employees");
me.c.load();
me.tbar=
[
{
xtype: 'combo',
fieldLabel: 'Employee',
width: 300,
labelWidth: 65,
typeAhead: false,
forceSelection: true,
store: me.c,
queryMode: 'local',
displayField: 'Name',
valueField: 'Id',
listeners: {
select: function (combo, records) {
console.log(records[0].get('Id'));
me.store.proxy.extraParams.uid = records[0].get('Id');
me.store.load();
},
scope: this
}
}
];
しかし、これにより、避けたい追加のリクエストが発生します。
私の 2 番目のアイデアは、空のストアを作成し、最初のストアからすべてのリーフを追加することでした (従業員の同じリストが含まれますが、階層は含まれないため)。
すべてのリーフを新しいストアにコピーするメソッドを作成しました。
cloneStore: function(source) {
var target = Ext.create('Sch.data.ResourceStore', {
model: 'MyApp.Model.Employee'
});
var node = source.getRootNode();
node.eachChild(function (myNode) {
if (myNode.isLeaf()) {
var newData = Ext.clone(myNode.copy().data);
var model = new source.model(newData, newData.id);
target.add(model);
}
});
現在、これはストアの最初のレベルをコピーしています。このメソッドに再帰を追加して、サブノードからリーフを追加する必要があります。
またvar newData = Ext.clone(myNode.copy().data);
、新しいレコードにそのツリーストアのすべてのフィールドが含まれる場合、ソース ストアからターゲットに 2 つのフィールドのみをコピーするにはどうすればよいでしょうか。必要なフィールドは 2 つだけです (id、名前)。
cloneStore
従業員を treeStore から Store に再帰的にコピーする方法を変更し、必要なフィールドのみをコピーするにはどうすればよいですか? メソッドでそれらを指定する必要がありますか。
EDIT 関数を修正して、再帰的に呼び出すことができるようにしました。
cloneStore: function(source) {
var target = Ext.create('MyApp.Store.EmployeesForComboBox');
var node = source.getRootNode();
this._addLeafsToStore(target, node);
return target;
},
_addLeafsToStore: function(store, node) {
node.eachChild(function (myNode) {
if (myNode.isLeaf()) {
store.add({
Id: myNode.get('Id'),
Name: myNode.get('Name')
});
} else {
this._addLeafsToStore(store, myNode);
}
},this);
},
これは非常にうまく機能しますが、コピーしたい Store とフィールドがハードコーディングされているため、より普遍的な機能を作成したいと考えています。
追加の質問:
Ext.clone を使用して保存する新しいレコードを追加する方法 (最初のソリューション) と、必要なフィールドのみを追加する方法 (2 番目のソリューション) のどちらのオプションが優れていますか?