2014-04-15 2 views
1

У меня есть магазин с прокси-сервером localstorage, но я не могу сохранить данные. Код довольно прост:ExtJs - Не удалось сохранить магазин в localStorage

onToolbarTicketsadd: function(me){ 
    var tickets = this.getStore('Tickets'); 
    tickets.add({id: 1, name: 'new'}) 
    console.log(tickets.getById(1), tickets.count()) 
    tickets.sync({callback: function(){console.log('synched')}}) 
}, 

билет будет добавлен в магазин, так как первый console.log доказывает, но команда sync() не работает. Инспектор localStorage показывает только пустую запись Tickets: '', а функция callback также не вызывается.

Что мне не хватает? Что необходимо для работы прокси-сервера localstorage?

Примечание: проблема не в браузере: я нахожусь в последних браузерах Chrome и Firefox.

Вот код для магазина и модели:

Ext.define('App.store.Tickets', { 
    extend: 'Ext.data.Store', 
    model: 'App.model.Ticket', 
    proxy: { 
     type: 'localstorage', 
     id: 'Tickets' 
    } 
}); 

Ext.define('App.model.Ticket', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'} 
    ] 
}); 

Демонстрационный проблемы является here.

+0

Ваша демонстрационная ссылка кажется сломанной, не могли бы вы предоставить скрипку для этого? поведение кажется очень странным, поэтому его базовый –

+0

Нет, он не сломан, для загрузки требуется всего лишь много времени. Ну, я нашел решение ... –

ответ

2

Если вы хотите сохранить id исключительно для своего собственного имени поля, затем вручную устанавливая idProperty от модели к чему-то другому, кажется, решить эту проблему - увидеть этот working demo. Обратите внимание, что если это потребуется, вам придется принудительно использовать свою уникальность в атрибуте.

Ext.define('MyModel', { 
    extend: 'Ext.data.Model', 
    idProperty: '_id', // <-- here 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'} 
    ] 
}); 
3

Это заняло у меня много времени, чтобы найти. Проблема связана с тем, как Extjs определяет, когда необходимо синхронизировать запись: свойство phantom.

Чтобы добавить новую запись в магазин, не нужно указывать id. Это не будет работать (так как идентификатор установлен, то запись не будет помечена как phantom, и он не будет синхронизироваться):

store.add({id: 1, name: 'new'}) 
store.sync() 

Это будет работать:

store.add({name: 'new'}) 
store.sync() 

Существует также возможно обходное решение, установив свойство phantom после добавления записей. Это может быть необходимо, когда id имеет какое-то значение, и больше, чем просто autoincremented значение:

Ext.Array.each(store.add({id: 1, name: 'new'}), function(record){ 
    record.phantom = true 
}); 
store.sync() 

Намек к проблеме производится в Extjs.data.Model.phantom: Любая запись, которая имеет рк набор реальной базы данных в качестве его свойства идентификатора НЕ Фантом - это реально.
Понятно, что это утверждение не обязательно верно, как указано выше в первом фрагменте кода, но поскольку Extjs 4.2 предполагает, что он всегда является истинным, появляется ошибка.

Я надеюсь, что это объяснение спасет кого-нибудь несколько часов работы. Это спасло бы меня день.

+1

Вы правы @Lorenz, проблема в свойстве id. Однако ваш обходной путь не является окей, фантом - это внутреннее поле, которое вы никогда не должны изменять никогда.Если свойство id важно, модель должна определять другое свойство id для внутреннего использования. Взгляните на документацию по модели. – lontivero

Смежные вопросы