0

我的应用程序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);
},

这工作得很好,但我想创建更通用的功能,因为现在我已经硬编码了 Store 和我想要复制的字段。

附加问题:
哪个选项更好:使用 Ext.clone(第一个解决方案)添加新记录到存储或仅添加必要的字段(第二个解决方案)?

4

1 回答 1

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

对于附加问题,我认为如果您的数据集很大,第二种解决方案会表现得更好。

于 2013-08-06T17:03:49.227 回答