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 ());
});
Но, очевидно, это не работает.
Итак, как я могу клонировать хранилище источников?
Ответы
Ответ 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);