Использование localStorage в магазине в Sencha Touch - PullRequest
1 голос
/ 25 января 2011

Я пытаюсь создать хранилище с элементами из localStorage в моем приложении Sencha Touch.

localStorage, из которого я хочу получить данные, является localStorage ["feeds"] и выглядит так:

"[{"title":"Title 1","url":"http://stackoverflow.com"},
  {"title":"Title2","url":"http://google.com"}]"

Я пытаюсь получить его в хранилище с помощью следующего:

var feedsPanel;
var store;
Ext.setup({
icon: 'icon.png',
glossOnIcon: false,
onReady: function(){
    Ext.regModel("feedModel", {
        fields: [
            { name: "title", type: "string" },
            {name: "url", type:"string"}
        ]
    });
    store = new Ext.data.Store({
            proxy: new Ext.data.LocalStorageProxy({
                id: 'feeds'
            }),
            model:"feedModel"
    });

Когда я в Chrome пробую store.load (), это завершится неудачно из-за TypeError: Cannot read property 'title 'of null.

Как я могу получить доступ к каждому названию и каждому URL из этого локального хранилища?

Глядя на пример игры «Пасьянс», я испытываю головокружение.

Остальные моиПриложение Sencha на данный момент не использует этот магазин и отлично загружается.Я проверяю, есть ли в магазине предметы с Консолью в Chrome.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Такой формат localStorage не является специфическим для магазинов Sencha.Но если вам действительно нужно читать из localStorage, отформатированного таким образом, вы можете попробовать следующее.Это возможно: -)

// first prefill localStorage
var feeds = [], j = 0;
while (j < 25) {
    feeds.push({'title': 'Title ' + ++j, url: 'http://link' + j + '.com'});
}
localStorage.setItem('feeds', Ext.encode(feeds));

// Sencha Touch v1 Application
new Ext.Application({
    name: 'App',

    launch: function() {
        var store = new Ext.data.JsonStore({
            id: 'feedstore',
            fields: ['title', 'url'],
            autoload: true,
            proxy: {
                id: 'feedproxy',
                type: 'memory',
                url: 'feeds',
                create: function () {
                    console.log('feed: CREATE');
                },
                read: function (operation, callback, scope) {
                    console.log('feed: READ');

                    var data = localStorage.getItem(this.url),
                        i, len, records = [];

                    console.log('data: ' + data);
                    data = Ext.decode(data);

                    if (Ext.isArray(data)) {
                        len = data.length;
                        for (i = 0; i < len; ++i) {
                            records.push(new this.model(data[i]));
                        };

                        // return model instances in a result set
                        operation.resultSet = new Ext.data.ResultSet({
                            records: records,
                            total  : len,
                            loaded : true
                        });

                        // announce success
                        operation.setSuccessful();
                        operation.setCompleted();

                        // finish with callback
                        if (typeof callback == "function") {
                            callback.call(scope || this, operation);
                        }
                        Ext.getBody().unmask();
                    }
                },
                update: function () {
                    console.log('feed: UPDATE');
                },
                destroy: function () {
                    console.log('feed: DESTROY');
                },
                reader: {
                    type: 'json'
                }
            }
        }).load();

        this.viewport = new Ext.Panel({
            fullscreen: true,
            layout: 'card',
            items: [{
                xtype: 'list',
                itemTpl : '{title}<br />{url}',
                store: store
            }]
        });
    }
});
1 голос
/ 29 января 2011

В локальном хранилище уже есть записи, которые имеют другую модель "схема"? Просто мысль: попробуйте другой прокси-идентификатор.

Но я также считаю, что вам лучше зарегистрировать магазин, чем напрямую его создавать. Попробуйте:

Ext.regStore('store', {
    proxy: {...}
    ...
);

Тогда

store:'store'

в списках или что-либо связанное с ним.

...