我有两个同一商店的实例吗?

时间:2012-04-18 06:26:05

标签: store sencha-touch-2

我使用带有jsonp代理的商店填充listview,该代理向我的服务器发送GET请求。当应用程序启动时,请求将被发送,列表项将按照应答的方式呈现。现在当我在我的数据库服务器中手动添加一个新项目并使用下面控制器中显示的代码刷新列表并检查控制台中的商店对象时,我可以看到新创建的项目在商店数据中。到目前为止一切都那么好,一切都如预料但是,新项目不在列表中刷新。奇怪的是,当我检查列表对象及其包含的商店对象时,不包括新创建的项目。但是,当我重新启动应用程序(而不是重新加载商店并刷新列表)时,新创建的项目将出现在列表中。对我来说,似乎我有两个存储实例,一个带有新数据(我用Ext.getStore检索)和一个没有(listview中的一个),我认为应该实际上是相同的。怎么可能?下面我告诉你我是怎么做的。非常感谢任何帮助。

控制器

Ext.define('VB1.controller.ListController', {
    extend: 'Ext.app.Controller',
    config: {
        refs: {
            listView: 'listview',
            refreshButtonTap: '#refreshbutton',
        },
        control: {
            refreshButtonTap: {
                onRefreshList: 'refreshList',
            },
        }    
    },
    launch: function () {
        this.callParent(arguments);
        Ext.getStore('MyStore').addListener('load', 'recordLoaded', this);
    },
    refreshList: function () {
        var loadedStore = Ext.getStore('MyStore').load();
        console.log(loadedStore) //here the new item is included
    },
    recordLoaded: function () {
        var list = this.getListView();
        list.refresh();
        console.log(list) //here the new item is not included in the store object inside   
                                  //listobject
    }
});

商店

Ext.define('VB1.store.MyStore', {
    extend: 'Ext.data.Store',
    alias: 'widget.mystore',
    config: {
        model: 'VB1.model.MyModel',
        autoLoad: true,
        proxy: {
            type: 'jsonp',
            url : 'myUrl.js',
            enablePagingParams: false,
            reader: {
                type: 'json',
                rootProperty: 'array.resources'
            },
        },
    },
});

listview

Ext.define('VB1.view.ListView', {
    extend: 'Ext.dataview.List',
    alias: 'widget.listview',        
    requires: [
        'Ext.dataview.List',
    ],
    scrollable: 'vertical',
    config: {
        loadingText: "loading...",
        emptyText: '</pre><div class="notes-list-empty-text">No notes found.</div><pre>',
        itemTpl: '</pre><div class="list-item-title">{title}</div><div class="list-item-narrative"><img src="{listlogo}"/></div><pre>',
    },
    listeners: {
        itemtap: function(list, index, item, record) {
            this.fireEvent('showDetails', record, this);
        }
    },
});

这就是我在应用启动时将包含商店的列表添加到视口的方式

var listView = {
    xtype: 'listview',
    store: {xtype: 'mystore'},
}
Ext.Viewport.add(listView);

1 个答案:

答案 0 :(得分:1)

我刚刚发现了问题所在。首先,我怀疑这家商店被实例化了2次。显然有一次是应用程序,另一次是由视图。因此我最终得到了两家商店。因为我没有设置storeID,所以根据我在商店的别名配置中给出的xtype名称,商店被两个唯一ID识别。

我解决的商店和登录控制器如下面有id ex-mystore-1

var loadedStore = Ext.getStore('MyStore').load();
      console.log(loadedStore) //here the new item was included

并且列表视图对象中的商店获得了id ext-mystore-2

var list = this.getListView();
    console.log(list._store); //here the new item was not included

当我向商店添加storeId时,改变了我有利的漏洞问题。之后,我仍然有两个商店,但具有相同的storeIds(但具有不同的唯一或可观察的ID)。好新的是现在新项目都包含在两个商店实例中。我还能够通过不在列表视图中实例化商店的xtype但通过storeID引用它来摆脱第二个商店实例。现在一切正常。感谢任何看过这个的人。我希望这有助于找到类似麻烦的人。