Как повторно использовать сохраненные данные в localstorage в Sencha Touch?

#local-storage #sencha-touch

#локальное хранилище #sencha-touch

Вопрос:

Я очень новичок в Sencha Touch. Мне действительно нравится продукт, но у меня возникли проблемы с решением этой проблемы. Пожалуйста, помогите. Я занимаюсь этим 3 дня!!!

Я смог сохранить данные в localstorage для повторного использования. Но я не могу повторно использовать данные из хранилища ни в каких других панелях (или страницах) и параметрах в URL. Я могу использовать данные типа app.UserStore.getAt(0).get(‘id’), вызывая их в обработчике событий, но не в параметре url или значении, которое я присваиваю.

Это просто невозможно использовать формат app.UserStore.getAt(0).get (‘id’) где-либо еще? Если да, то какие у меня есть варианты решения этой проблемы?

— сохраненные данные в localstorage после входа в систему

  Ext.regModel('User', {
    fields: ['id', 'email'],

    proxy: { type: 'localstorage',  id: 'user-localstorage' }
 });

app.UserStore = new Ext.data.Store({
    model: 'User',
    storeId: 'ConfigStore',
    autoLoad: true
});
  

— источник для повторного использования данных в localstorage (пожалуйста, проверьте app.UserStore.getAt(0).get(‘id’) в источнике)

  • Я могу видеть сохраненные данные*

** Я получаю сообщение об ошибке из-за этого кода. (страница не отображается) **

 initComponent: function(){

    var toolbarBase = {
        xtype: 'toolbar',
        title: 'Group Chat'
    };

       toolbarBase.items = [{ xtype: 'spacer', flex: 1 }, {
            iconCls: 'action',
            iconMask: true,
            scope: this,
            ui: 'plain',
            handler: function(){

                Ext.Msg.alert('Login Sucess', *app.UserStore.getAt(0).get('id')*, Ext.emptyFn);
            }
        }];


    this.dockedItems = toolbarBase;

    var searchModel = Ext.ModelMgr.getModel("Search");

    var search = new searchModel({
        query: **app.UserStore.getAt(0).get('id')**
    });

    var store = search.tweets();

    var tweetList = {
        cls: 'timeline',
        emptyText   : '<p class="no-searches">No Message Found</p>',

        disableSelection: true,

        store: store,

        plugins: [ {
            ptype: 'pullrefresh'
        }],

        itemCls: 'tweet',
        itemTpl: new Ext.XTemplate(
            '<div class="avatar"<tpl if="profile_image_url"> style="background-image: url({profile_image_url})"</tpl>></div>',
            '<div class="x-tweetanchor"></div>',
            '<div class="tweet-bubble">',
                '<div class="tweet-content">',
                    '<h2>{from_user}</h2>',
                    '<p>{text:this.linkify}</p><strong></strong>',
                    '<span class="posted">{created_at}</span>',
                '</div>',
            '</div>',
            {
                linkify: function(value) {
                    return value.replace(/(http://[^s]*)/g, "<a target="_blank" href="$1">$1</a>");
                }
            }
        )
    };

    this.list = new Ext.List(Ext.apply(tweetList, {
        fullscreen: true
    }));

   this.listpanel = new Ext.Panel({
        layout: 'fit',
        items: this.list,
        dockedItems: [{
            xtype: 'toolbar',
            dock: 'top',
            ui: 'gray', 
            items: [{
                xtype: 'textfield',
                placeHolder: 'Share your thoughts with your Peers',
                name: 'searchfield'
            }]
        }]
    });

    this.items = this.listpanel;
    this.list.store.load();

    app.views.ChatList.superclass.initComponent.call(this);
   }
  

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

1. вы получаете ошибку JavaScript?

Ответ №1:

Как вы видите данные? Используете ли вы консоль отладки в чем-то вроде Chrome? Как вы сохраняете данные?

Вероятно, у вас в хранилище есть устаревшие данные. Выполнение get('id') над неопределенным объектом приведет к вашей ошибке JavaScript. Вы должны выполнить app.UserStore.load() команду, прежде чем пытаться получить доступ к данным в хранилище (в данном случае, вероятно, в верхней части initComponent ). Это загрузит данные с диска и обеспечит их доступность для использования. autoload Указанное применяется только при создании хранилища.

Что касается комментария: Если вы добавите новые данные через хранилище, вместо создания объекта, эти данные будут в этом хранилище и, следовательно, доступны без необходимости обновления.

 var user = app.UserStore.add({email: 'a@b.com'});
user.save() //OR app.UserStore.sync();
  

Таким образом, вам не придется обновлять, но вам придется выполнить синхронизацию () в хранилище или save () в модели, чтобы убедиться, что данные сохраняются.

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

1. Большое вам спасибо. Я изменил это на основе вашего предложения, и это работает! Еще раз спасибо за вашу помощь.

2. У меня есть еще один вопрос… Я могу повторно использовать все данные localstorage для всех других панелей. Но когда я очищаю или восстанавливаю данные localstorage, это не работает на других панелях, если я не обновлю все это целиком. Таким образом, конечный результат всегда на шаг отстает от действия. Я сделал store.sync() после внесения изменений. Мой вопрос таков… Как я могу повторно использовать сохраненные данные на одной панели, чтобы мне не приходилось обновлять каждую панель, особенно внутри card?