Как заставить LocalStorageProxy работать с хранилищем данных

#javascript #sencha-touch #local-storage #extjs

#javascript #сенча-касание #local-storage #extjs

Вопрос:

Привет,

Я создаю приложение Sencha Touch для iPhone, которое использует хранилище данных, которое прекрасно работает с вложенным списком, но я уперся в стену.

Ему нужен способ считывать данные из статического хранилища (TreeStore), загружать их в localStorage, чтобы они были доступны для записи, а затем сохранять некоторые пользовательские настройки. Я выяснил, что localStorageProxy, скорее всего, то, что мне нужно (я с облегчением обнаружил, что мне не пришлось сериализовать и десериализовать хранилище JSON вручную!) но после прочтения документации по нему и нескольких неудачных попыток я в растерянности.

В нынешнем виде он генерирует хранилище localStorage …, но оно пустое, я думаю, это потому, что я ничего в него не загружал, но при выполнении app.stores.event_store.load(); экран остается пустым, и консоль показывает, что localStorage пуст без ошибок.

Моя модель:

Ext.regModel('События', { 
 поля: [
 {имя: 'текст', тип: 'строка'}, 
 {имя: 'info', тип: 'string'}, 
 {имя: 'attend', тип: 'boolean', значение по умолчанию: 'false'}
 ] 
});

Мой магазин:

app.stores.event_store = новые внешние данные.Хранилище данных ({
 модель: 'События', 
 root: данные, 
 StoreID: 'eventStoreId', 
 прокси: {
 введите: 'localstorage', 
 идентификатор: 'eventsAttending', 
 url: 'store.js ', 
 читатель: {
 тип: 'дерево', 
 root: 'элементы'
 }
 }
});

app.stores.event_store.load();

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

Полное приложение можно найти в его репозитории на GitHub.

-fetimo

Ответ №1:

Хранилище дерева ожидает иерархические данные

 var data= { 
    text: 'Groceries',
    items: [{
        text: 'Drinks',
        items: [{
            text: 'Water',
            items: [{
                text: 'Sparkling',
                leaf: true
            },{
                text: 'Still',
                leaf: true
            }]
        },{
            text: 'Coffee',
            leaf: true
        }]
    }] 
}
  

Но LocalStorageProxy не может соответствовать модели для этой структуры данных.

Я бы использовал AJAX-запрос для загрузки «store.js » файл, использующий localStorage непосредственно для «хранения» большого двоичного объекта данных.

 Ext.Ajax.request({
    url: 'store.js',
    success: function(response, opts) {
       localStorage.StoreJSBlob = response.responseText;
    }
});
  

тогда ваше хранилище будет выглядеть примерно так:

 var store = new Ext.data.TreeStore({
    model: 'Events',
    root: localStore.StoreJSBlob,
    proxy: {
        type: 'ajax',
        reader: {
            type: 'tree',
            root: 'items'
        }
    }
});
  

Вам просто нужно правильно связать события вместе, так как асинхронные вызовы могут сбить вас с толку

Комментарии:

1. Я боялся, что это единственный выход. Какой позор. И я потратил слишком много времени на то, чтобы заставить хранилище localStorage работать с моим базовым списком!