0

アプリケーション 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 番目のソリューション) のどちらのオプションが優れていますか?

4

1 に答える 1