Extjs存储加载成功处理程序没有被触发

时间:2012-11-12 23:19:31

标签: ajax extjs load extjs4 store

我有一个store load方法,它通过ajax请求返回数据。我可以看到使用Firebug返回数据,但我的成功处理程序没有被调用:

    this.getCategoriesStore().load({params:{'id':d.data.category_id}}, {
        success: function(category) {
            console.log("Category: " + category.get('name'));
        },
        error: function(e) {
            console.log(e);
        }
    });

我将返回一个成功参数以及数据:

{"success":true,"categories":{"id":5,"name":"Frying","section_id":2}}

是否有遗漏或我做错了什么?

2 个答案:

答案 0 :(得分:20)

嗯,我想你正在寻找这个:

store.load({
    params:{'id':d.data.category_id},
    scope: this,
    callback: function(records, operation, success) {
        if (success) {
            console.log("Category: " + category.get('name'));
        } else {
            console.log('error');
        }
    }
});

API 并不是那么明显,你的额外参数也可以放在那里。但ExtJS经常使用配置对象来包装。

编辑以回答评论:

简短的回答是:

现在更长的版本: 在商店的情况下,您可以直接提供匿名(或具体)回调或注册事件。在这种情况下,两者都会起作用。

但是你可以只有一个回调,而你可以有很多事件。在进一步的场景中,您会发现事件更适合的情况或事件是唯一的方式。当你在倾听时,情况总会如此。以下是对此的一些注意事项:

  • 只需要一次回调就可以使用{single:true}属性。示例:store.on('load', function(s) { /* do something*/ }, scope, { single: true })侦听器在调用后将被删除。这是使用匿名函数的必要原因,无法删除。
  • 在大多数情况下使用 mon() ,直接在类定义中绑定侦听器,以确保侦听器与类的实例一起被销毁。

两者都可以节省浏览器内存。

答案 1 :(得分:6)

试试这个:

store.load({
    scope: this,
    callback: function(records, operation, success) {
        // the operation object
        // contains all of the details of the load operation
        console.log(records);
    }
});

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Store-method-load根据文档没有成功和错误回调。

提供回调的另一种方法是,您还可以在商店中添加“加载”事件监听器以获得相同的效果。