加载事件不在jsonstore中触发

时间:2011-08-17 14:16:47

标签: extjs sencha-touch

队,

我有一个jsonstore来加载我的列表。我正在使用内联数据加载商店而没有任何代理配置。我想调用我商店的加载事件。请告诉我怎么做。

以下是我的商店代码:

Store = new Ext.data.JsonStore({     model:'SettingModel',

getGroupString:function(){
        return 'Set Duration';
        },
autoLoad:false,     
data: [
    {name: '5 mins',   value: '5'},
    {name: '15 mins',   value: '15'},
    {name: '25 mins',   value: '25'},
    {name: '45 mins',   value: '45'}
],
listeners : {
    'load': function(){
        Ext.Msg.alert('App',"load");
    }
}});

Store.load();

使用上面的代码我收到以下错误消息:“未捕获的错误:您正在使用ServerProxy但没有提供它的URL”

如果我删除“Store.load();”行,我没有得到错误,列表填充数据。但是不会触发load事件。

请帮助我在这种情况下如何使加载事件发生。

先谢谢

4 个答案:

答案 0 :(得分:2)

数据内嵌时不会调用加载事件。此外,只有在使用AJAX请求访问数据时才应调用加载方法(这就是调用.load()方法时需要代理的URL的原因)。

尝试使用 loadData方法加载内联数据,而不是在对象构造函数和 datachanged事件中传递它,如果您想在每次调用loadData时进行侦听。

答案 1 :(得分:2)

Ext似乎正在推动商店与模特等一起使用。 感觉就像,因为你正在使用商店,它希望你做一个ajax调用来获取数据。 您可以通过指定代理来覆盖它:

        proxy: {
            type: 'memory',
            reader: {
                type: 'json',
                root: 'items'
            }
        },

直接来自商店的Ext文档:http://dev.sencha.com/deploy/touch/docs/

Ext.regModel('User', {
fields: [
    {name: 'firstName', type: 'string'},
    {name: 'lastName',  type: 'string'},
    {name: 'age',       type: 'int'},
    {name: 'eyeColor',  type: 'string'}
]
});
哦,看,他们在本地商店没有内存代理!

new Ext.data.Store({
model: 'User',
data : [
    {firstName: 'Ed',    lastName: 'Spencer'},
    {firstName: 'Tommy', lastName: 'Maintz'},
    {firstName: 'Aaron', lastName: 'Conran'},
    {firstName: 'Jamie', lastName: 'Avins'}
]
}); 

作为一个有趣的奖励,JsonStore甚至不在触摸文档中。

http://jsfiddle.net/6WV3m/3/是extjs 4.0代码,但它可以在我的本地触摸上工作。

答案 2 :(得分:1)

首先,您需要确保正在使用您的商店。你有autoLoad:false,所以它不会自己加载。您绑定它的组件必须加载它,或者您必须调用它的加载方法。此外,您应该检查异常状态。

通常你想要采用以下格式:

listeners : {
    load : {
            fn : function(){
                    Ext.Msg.alert('App',"load");
            },
            scope : this
        },
    exception : {
            fn : function( err ){
                    Ext.Msg.alert('App',"Oh Crap!"+err);
            },
            scope : this
        }
}

这样你可以控制功能和范围,这是一个经常出现的问题,

答案 3 :(得分:1)

pablodcar的回答应该真的适合你。您可以使用空数据数组实例化商店,然后使用要加载的数据数组调用loadData()方法。如果您使用 storeId 启动商店,然后使用Ext.data.StoreManager.lookup(storeId)进行查找,则可以从任何地方调用此方法。

要在商店数据发生变化时收到通知,您可以收听datachanged事件。