Подтвердить что ты не робот

ExtJS 4: магазины клонирования

Я пытаюсь выяснить, как клонировать 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 ());
});

Но, очевидно, это не работает.

Итак, как я могу клонировать хранилище источников?

4b9b3361

Ответ 1

Решение ExtJS 3.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 дает знакомые вещи, я не знаю.. Я использую этот специальный клон с Ext JS 3.x

Возможно, что при создании нового хранилища требуется указать прокси memory (я не уверен сейчас, потому что я всегда использую "предоставленный" способ.

Решение ExtJS 4.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;
}

Ответ 2

ExtJS 6.x, 5.x и 4.x решение

Здесь представлено решение Quasi-all 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;
}

Ответ 3

Я успешно сделал следующее в Ext.js 4.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);