Sencha Touch (1.1) — модель не обновляется в локальном хранилище после успешного сохранения

Моя установка

  • Сафари 5.1.2 (Макинтош)
  • Сенча Тач 1.1

Проблема

Процесс

У меня есть модель и магазин. Я обновляю запись, используя метод set(field,value), описанный здесь: API - Установить. После обновления полей я использую метод save(), описанный здесь: API — Сохранить.

Результат

Запись обновляется во всех списках, привязанных к хранилищу, и кажется сохраненной, однако, когда я обновляю веб-страницу, отображаются старые значения. . Таким образом, запись обновляется, хранилище видит новые данные, списки, привязанные к хранилищу, обновляют свое отображение, но фактическое представление данных в локальном хранилище никогда не обновляется. Если вы используете консоль браузера для поиска и проверки элемента с чем-то вроде var record = summaryStore.getAt(4), вы обнаружите, что атрибут dirty имеет значение false, даже если вызов save() не был выполнен. Также summaryStore.getUpdatedRecords() возвращает пустой набор независимо от того, был ли вызван метод save().

Дополнительная документация

API — Модели

API — Магазины

API — прокси-серверы

Код

Хранить

var summaryStore = new Ext.data.Store({
model: 'EventSummary',
storeId: 'summaryStore',
sortOnLoad: true,
sorters: [
    {
        property: 'date',
        direction: 'DESC'
    }
],
proxy: {
    type: 'localstorage',
    id  : 'summary-cache'
}
})

Модель

Ext.regModel('EventSummary', {
fields: [
    {name: 'child', type: 'string'},
    {name: 'date', type: 'date'},
    {name: 'description', type: 'string'},
    {name: 'event_id', type: 'int'}
],
proxy: summaryStore.proxy
})

Пример

var record = summaryStore.findExact('event_id', 90)
record.date = new Date();
record.description = 'Vitamin K Shot`
record.save()

Как до, так и после record.save() флаг dirty имеет значение false. summaryStore.getUpdatedRecords() возвращает пустой набор как до, так и после сохранения. Все списки для хранения сводки отражают сделанные изменения независимо от того, сохранена ли запись.

Дополнительные примечания

Хранилище заполняется этим вызовом, который следует за объявлением хранилища и модели. summaryStore.load()


person wmarbut    schedule 15.01.2012    source источник


Ответы (3)


Упомянутый выше обходной путь setDirty у меня не сработал, но я нашел другой обходной путь для сохранения записей в прокси-сервере WebLocalStorage:

record.set('field1', 'abc');
store.proxy.setRecord(record);

Я использую 1.1.1. (Кстати, по какой-то причине я не могу вызвать save(); исключение говорит, что мне нужен URL-адрес, который неприменим к weblocalstorage.)

person Trevor Cox    schedule 29.02.2012

Используйте метод sync() в хранилище, чтобы сохранить данные в локальном хранилище.

Попробуйте этот код вместо вашего примера выше:

var record = summaryStore.findExact('event_id', 90)
record.set('date', new Date());
record.set('description', 'Vitamin K Shot`);
record.save();

summaryStore.sync();
person Anthony    schedule 15.01.2012
comment
К сожалению, в данном случае это не работает. На самом деле хранилище не распознает изменения summaryStore.getUpdatedRecords() и возвращает пустой набор. - person wmarbut; 16.01.2012
comment
После установки значения попробуйте model.setDirty(). - person Anthony; 16.01.2012
comment
К сожалению, это тоже не сработало. В итоге мне пришлось изменить источник объекта WebStorageProxy. - person wmarbut; 16.01.2012

Обновить

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

Завершить обновление

Эту проблему можно решить, внеся изменения в WebStorageProxy.js.

Обратите внимание, что изменение этого файла не влияет на ваш файл sencha-touch.js. Вам придется перестроить его или изменить напрямую

Этот код не работал

setRecord: function(record, id) {
    if (id) {
        record.setId(id);
    } else {
        id = record.getId();
    }

Эта строка, в частности id = record.getId();, по какой-то причине не определялась на объектах, которые уже были добавлены в хранилище. Решение состоит в том, чтобы добавить

if (id === undefined) {
    id = record.internalId;
}

Окончательный код выглядит так

setRecord: function(record, id) {
    if (id) {
        record.setId(id);
    } else {
        id = record.getId();
        if (id === undefined) {
            id = record.internalId;
        }
    }
person wmarbut    schedule 15.01.2012