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. Ну что ж... Однако этот был протестирован.