Extjs数据仓库加载成功处理程序未被触发

5
我有一个存储加载方法,通过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个回答

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中,通常使用配置(config)对象来封装它们。

编辑回复评论:

简短回答是:是的

现在详细说明:

对于Store,您可以直接提供匿名(或具体)回调函数或注册事件。在您这里的情况下,两者的效果都相同。

但是,您只能有一个回调,而您可以有多个事件。在进一步的场景中,您将发现事件更适合或事件是唯一的方式。这总是在您正在侦听时的情况。以下是一些注意事项:

  • 当您仅需要一次回调时,请使用 { single: true } 属性。例如: store.on('load', function(s) { /* do something*/ }, scope, { single: true })。该侦听器会在调用后被删除。这是必需的,因为使用匿名函数时,无法移除它。
  • 在大多数情况下,当您在类定义中直接绑定侦听器时,请使用mon() ,以确保侦听器随类的实例一起销毁。

两者都会节省您的浏览器内存。


有用的额外信息,谢谢。我可以问一下我加载存储的方式是否正确吗?我在控制器中加载了3个存储,而这种方法似乎是自动生成的。我仍在熟悉语法-对我来说,this.store.Categories.load()似乎更明显,但显然不是这种情况! - BrynJ
@BrynJ好的,我会更新我的帖子,提供有关回调和监听器的更多信息。 - sra
刚刚注意到我的代码中括号放错了位置 - 我很确定我也尝试过将回调函数命名为callback...如果是这样的话,希望这次能行 :) - BrynJ
感谢提供更多信息。我会继续关注事件的进展。 - BrynJ

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 方法中没有成功和错误回调。另一种提供回调的替代方法是在存储器上添加“load”事件侦听器,以达到相同的效果。

谢谢您的答复。您能否提供更多的上下文 - 当前的调用在控制器函数中...我不确定这应该如何实现? - BrynJ
请将以下与编程有关的内容从英语翻译成中文。仅返回已翻译的文本:与“success”块相同,只是改为“回调” :) - dbrin
啊,我明白了,我会再试一次。 - BrynJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接