ExtJS 4-обновление / Обновление одной записи
У меня проблема, которая меня беспокоит.
У меня есть сетка, и когда я dblclick на элементе, я хочу открыть окно для редактирования этого элемента. Довольно стандартный материал. Проблема в том, что я хочу быть уверен, что запись актуальна, потому что другие люди, использующие программу, возможно, изменили или даже удалили ее.
Я мог бы перезагрузить магазин, но я хочу, чтобы была проверена только одна конкретная запись... Поэтому я решил, что просто возьму данные, создам другую запись и заменю существующую один в магазине, но я действительно хочу знать лучший способ для этого
имейте в виду, что RESTful proxy не является для меня вариантом, хотя я не знаю, работает ли операция обновления в этом случае ( сервер -> клиент).
изменить: это может помочь кому-то: все, что я сделал, это скопировал данные и необработанные объекты из новой записи в старую, а затем "зафиксировал" изменения. работать на меня.
спасибо.
4 ответов
лучший способ сделать что-то подобное-перезагрузить запись в случае, если откроется окно. Таким образом, если вы, например, загружаете запись из хранилища сетки в форму в окне, вы можете использовать свою модель для загрузки из идентификатора.
Item.load(id, { success: function(r) { form.loadRecord(r); } });
после сохранения вы, вероятно, также должны вызвать refresh в представлении сетки, которое перерисует изменения из события save. Вы также можете использовать refreshNode (см. документацию grid view) о точном запишите в магазине, если вас беспокоит производительность.
конечно, вам не нужно использовать RESTful прокси с этим, вы можете использовать любой прокси, пока он будет загружать одну запись.
ExtJS 4.1
У меня была аналогичная проблема, и в качестве эксперимента я попробовал
sStore.load({
id: mskey,
addRecords: true
});
где mskey-uuid текущей загруженной записи.
Я не удалить существующую запись (в качестве эксперимента) и его обновлено существующая запись, которая имела тот же идентификатор с новыми данными с сервера (через модель --> REST proxy). Прекрасно!
Я знаю, что вы сказали, что не используете прокси-сервер REST, но это может помочь другим, кто нашел этот пост в поиске поисковых терминов, таких как имя вашей темы (вот как я попал сюда!)
Итак, похоже, что "addRecords" означает add или обновление.
к вашему сведению, Мюррей!--2-->
С ExtJS 4.1, вот переопределение:
В CoffeeScript :
# Adds "reload" to models
Ext.define "Ext.ux.data.Model",
override: "Ext.data.Model",
# callBack is called with success:boolean
reload: (callBack) ->
Ext.getClass(@).load @getId(),
success : (r, o) =>
for k, v of r.data
@data[k] = v
@commit()
callBack(true) if Ext.isFunction(callBack)
failure: =>
callBack(false) if Ext.isFunction(callBack)
в JS (не тестировал):
Ext.define("Ext.ux.data.Model", {
override: "Ext.data.Model",
reload: function(callBack) {
var me = this;
return Ext.getClass(this).load(this.getId(), {
success: function(r, o) {
var k;
for (k in r.data) {
me.data[k] = r.data[k];
}
me.commit();
if (Ext.isFunction(callBack)) {
callBack(true);
}
},
failure: function() {
if (Ext.isFunction(callBack)) {
callBack(false);
}
}
});
}
});
Я создал переопределение на Ext.данные.Модель для добавления дополнительного метода, который можно использовать для обновления данных существующей записи (экземпляра модели).
Ext.define('Ext.overrides.data.Model', {
override: 'Ext.data.Model',
/**
* Refresh the data of a record from the server
*/
reloadData: function(cb) {
var me = this;
var id = me.getId();
Ext.ModelManager.getModel(me.modelName).load(id, {
callback: function(record, operation, success) {
if (!success) {
Ext.Error.raise('Problem reloading data from server in record');
}
if (!record) {
Ext.Error.raise('No record from server to reload data from');
}
//change the data of the record without triggering anything
Ext.apply(me.data, record.getData());
//call a final callback if it was supplied
if (cb) {
cb.apply(me, arguments);
}
}
});
return me;
}
});
вот как вы можете его использовать. Это на самом деле довольно просто:
myRecord.reloadData(function(record, operation, success) {
//Done updating the data in myRecord
});
внутренне он использует метод load для связанной модели для создания новой записи. Эта новая запись основана на том же идентификаторе, что и исходная запись, для которой был вызван метод reloadData. Вызов данных нового запись применяется к данным исходной записи. Никаких событий, которые, вероятно, вы хотите.
Это Ext 4.2.1. Вероятно, есть десятки сценариев, что это решение ломается, но мы всегда можем уточнить, не так ли.
Update: это решение в основном реализует то же самое, что и решение @Drasill. Ну что ж... Однако этот был протестирован.