Sencha Touch (1.1) - Модель не обновляется в локальном хранилище после «успешного» сохранения - PullRequest
1 голос
/ 15 января 2012

Моя настройка

  • Safari 5.1.2 (Macintosh)
  • Sencha Touch 1.1

Выпуск

Процесс

У меня есть модель и магазин. Я обновляю запись, используя метод set(field,value), описанный здесь: API - Set . После обновления полей я использую метод 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
})
* +1057 * Пример * * одна тысяча пятьдесят восемь
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()

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

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

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

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

0 голосов
/ 16 января 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;
        }
    }
0 голосов
/ 16 января 2012

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

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

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

summaryStore.sync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...