14

Ext.data.Store古い参照を保持せずにクローンを作成する方法を理解しようとしています。

いくつかのコードでもっとよく説明しましょう。ソースストアは次のとおりです。

var source = Ext.create ('Ext.data.Store', {
    fields: ['name', 'age'] ,
    data: [
        {name: 'foo', age: 20} ,
        {name: 'boo', age: 30} ,
        {name: 'too', age: 10} ,
        {name: 'yoo', age: 80} ,
        {name: 'zoo', age: 30}
    ]
});

私がやりたいことの例に従います:

var target = source;
target.removeAll ();
// Here I need to have target empty and source unchanged
// But in this case, source is empty as well

さて、上記の例では、コピーは参照によって行われますが、値によって行う必要があります。だから私Ext.clone ()はドキュメントで見つけましたが、次のような複雑なオブジェクトでは機能しないようExt.data.Storeです:

var target = Ext.clone (source);
target.removeAll ();
// source is still empty

それから私は試してみましExt.data.Model.copy ()たが、それを機能させる唯一の方法はこれです:

var target = Ext.create ('Ext.data.Store', {
    fields: ['name', 'age']
});

source.each (function (model) {
    target.add (model.copy ());
});

今、私の理由で、私は別のものをインスタンス化したくないExt.data.Storeので、これを避けたいです:

var target = Ext.create ('Ext.data.Store', {
    fields: ['name', 'age']
});

私はこのようなものが欲しいです:

var target;

source.each (function (model) {
    target.add (model.copy ());
});

しかし、明らかに、それは機能しません。

では、どうすればソースストアのクローンを作成できますか?

4

4 に答える 4

15

ExtJS 6.x、5.x、4.xソリューション

これが準すべてのExtJSバージョンのソリューションです。record.copyはすでにデータのクローンを作成していることに注意してください。再度Ext.cloneする必要はありません。

function deepCloneStore (source) {
    source = Ext.isString(source) ? Ext.data.StoreManager.lookup(source) : source;

    var target = Ext.create(source.$className, {
        model: source.model,
    });

    target.add(Ext.Array.map(source.getRange(), function (record) {
        return record.copy();
    }));

    return target;
}
于 2015-11-04T11:47:44.423 に答える
13

ExtJS3.xソリューション

これを試して:

cloneStore : function(originStore, newStore) {

    if (!newStore) {
        newStore = Ext.create('Ext.data.Store', {
            model : originStore.model
        });
    } else {
        newStore.removeAll(true);
    }

    var records = [], originRecords = originStore.getRange(), i, newRecordData;
    for (i = 0; i < originRecords.length; i++) {
        newRecordData = Ext.ux.clone(originRecords[i].copy().data);
        newStore.add(new newStore.model(newRecordData, newRecordData.id));
    }

    newStore.fireEvent('load', newStore);

    return newStore;
}

注:は、オブジェクトのディープExt.ux.cloneクローンを作成する分離されたプラグインです(これが見つかります) 。たぶん、Ext JS 4はおなじみのものを提供しますが、私にはわかりません。ExtJS 3.x以降、この特別なクローンを使用しています。

新しいストアを作成するときにプロキシを指定する必要がある可能性がありますmemory(私は常に「提供された」方法を使用しているため、現時点ではわかりません。

ExtJS4.xソリューション

function deepCloneStore (source) {
    var target = Ext.create ('Ext.data.Store', {
        model: source.model
    });

    Ext.each (source.getRange (), function (record) {
        var newRecordData = Ext.clone (record.copy().data);
        var model = new source.model (newRecordData, newRecordData.id);

        target.add (model);
    });

    return target;
}
于 2012-09-28T21:39:29.203 に答える
2

私はExt.js4.1で次のことを成功させました:

var source = Ext.create('Ext.data.Store', {
    fields: ['name', 'age'],
    data: [
        {name: 'foo', age: 20},
        {name: 'boo', age: 30},
    ],
});

方法では:

cloneStore: function (source) {
    var clone = Ext.create('Ext.data.Store', {
        fields: ['name', 'age']
    });

    // load source store data
    clone.loadData(source.data.items);

    return clone;
}

列をなして:

var clone = Ext.create('Ext.data.Store', {
    fields: ['name', 'age']
}).loadData(source.data.items);
于 2017-09-11T23:20:21.360 に答える
0

これはまだ私が探していたものであり、上記の答えは私にとってそれを修正しなかったので、私は自分で別の解決策を見つけました:

var target = Ext.create ('Ext.data.Store', {
    // add other properties here if needed
    reader: source.reader
})

これは、ストアのクローンを作成するのに役立ちました。

于 2019-08-10T15:57:46.570 に答える