ExtJS 4 - обновить / обновить одну запись - PullRequest
8 голосов
/ 03 июня 2011

У меня есть проблема, которая меня беспокоит.

У меня есть сетка, и когда я нажимаю на элемент, я хочу открыть окно для редактирования этого элемента.Довольно стандартные вещи.Проблема в том, что я хочу быть уверен, что запись обновлена, потому что другие люди, использующие программу, возможно, изменили ее или даже удалили.

Я мог бы перезагрузить магазин, но мне нужна только одна конкретная записьчтобы быть проверенным ... Так что я решил, что я просто пойду получу данные, создам другую запись и заменим существующую в магазине, но я действительно хочу знать лучший способ сделать это

Помните, что RESTful-прокси для меня не вариант, хотя я не знаю, работает ли операция обновления в этом случае (сервер -> клиент).

РЕДАКТИРОВАТЬ: это может кому-нибудь помочья скопировал данные и необработанные объекты из новой записи в старую, а затем «зафиксировал» изменения.работал для меня.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 18 апреля 2013

ExtJS 4.1

У меня была похожая проблема и в качестве эксперимента попробовал

sStore.load({ id: mskey, addRecords: true });

где mskey - это uuid текущей загруженной записи.

Я не сначала удалил существующую запись (в качестве эксперимента), а обновил существующую запись, которая имела такой же идентификатор с новыми данными с сервера (через модель -> REST прокси). Отлично!

Я знаю, что вы сказали, что вы не используете REST-прокси, но это может помочь другим, кто нашел этот пост, в поиске поисковых терминов, таких как название вашей темы (именно так я сюда попал!)

Итак, похоже, что addRecords означает добавление или update.

FYI, Мюррей

4 голосов
/ 03 июня 2011

Лучший способ сделать что-то подобное - перезагрузить запись в событии, которое открывает окно.Таким образом, если вы, например, загрузите запись из хранилища сетки в форму в окне, вы можете использовать свою модель для загрузки из идентификатора.

Item.load(id, { success: function(r) { form.loadRecord(r); } });

После сохранения вы, вероятно, также должны вызвать обновление в представлении сетки, которое перерисовает изменения из события сохранения.Вы также можете использовать refreshNode ( см. Документацию по сетке ) для точной записи в магазине, если вы беспокоитесь о производительности.

Конечно, вам не нужно использовать успокоительный прокси с этим, вы можете использовать любой прокси, пока он будет загружать одну запись.

1 голос
/ 23 января 2013

С 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);
                }
            }
        });
    }
});
0 голосов
/ 18 февраля 2016

Я создал переопределение для Ext.data.Model, чтобы добавить дополнительный метод, который можно использовать для обновления данных существующей записи (экземпляра модели).

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. Вероятно, существуют десятки сценариев, что это решение ломается, но мы всегда можем уточнить, не так ли.

Обновление: это решение в основном реализует то же, что и @Drasill. Ну да ладно ... Этот был проверен, хотя.

...