仅使用所需字段将TreeStore转换为Store

时间:2013-08-05 14:51:47

标签: javascript extjs4 extjs4.2

我的应用程序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(第一个解决方案)添加新记录或仅添加必要字段(第二个解决方案)?

1 个答案:

答案 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']);

对于其他问题,我认为如果您的数据集很大,第二个解决方案的效果会更好。