我的应用程序EmployeesTree,Empolyees,History中有三个商店。 第一个是treegrid的源,第二个是用于在加载第三个stode时传递附加参数的组合框。
我的第一个方法是使用标准代理创建第二个商店,并使用请求从服务器加载员工。
在我的历史网格中,我有:
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
}
}
];
但这会引起我想避免的额外请求。
我的第二个想法是创建空商店并将第一个商店的每个叶子添加到它(因为它将包含相同的员工列表但没有层次结构)
我创建的方法应该将所有叶子复制到新商店:
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个字段(id,Name)。
如何修改cloneStore
方法以递归方式将员工从treeStore复制到Store,如何只复制所需的字段?我必须在我的方法中指定它们。
修改 我修改了我的函数,因此可以递归调用它。
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);
},
这很有效,但我想创建更多的通用功能,因为现在我有硬编码的商店和我要复制的字段。
补充问题:
什么选项更好:使用Ext.clone(第一个解决方案)添加新记录或仅添加必要字段(第二个解决方案)?
答案 0 :(得分:1)
要创建更通用的函数,您需要将硬编码的东西更改为函数参数:
cloneStore: function(source, target, fields) {
var node = source.getRootNode();
this._addLeafsToStore(target, node, fields);
return target;
},
_addLeafsToStore: function(store, node, fields) {
node.eachChild(function (myNode) {
if (myNode.isLeaf()) {
var config = {};
for (var i = 0; i < fields.length; i++) {
config[fields[i]] = myNode.get(fields[i]);
}
store.add(config);
} else {
this._addLeafsToStore(store, myNode, fields);
}
},this);
},
并将其称为:
var cloned = someObj.cloneStore(source, Ext.create('MyApp.Store.EmployeesForComboBox'), ['Id', 'Name']);
对于其他问题,我认为如果您的数据集很大,第二个解决方案的效果会更好。