商店的监听器功能在网格更新时触发两次

时间:2011-02-26 13:47:58

标签: extjs

我有一个可编辑的Ext网格面板。它使用的商店有一个监听器,可以在更改记录时触发函数:

listeners:{
    update: someFunction
    }, 

该函数会更改商店中的某些值,因此会再次触发该函数。 有没有办法运行该功能一次? 也许要使用另一个听众?

6 个答案:

答案 0 :(得分:2)

我通过添加

实现了这一目标
store.removeListener('update', someFunction);

在函数的开头更改商店中的值,并且:

store.addListener('update', someFunction);

最后。

也许有更好的方法?

答案 1 :(得分:2)

检查ExtJS Store documentation,您可能需要查看beforesave事件(强调我的):

  

在调用保存操作之前触发。保存包含销毁记录,更新记录和创建记录

或者你可以使用......

store.addListener('update', someFunction, store, {single: true});

...确保回调函数仅在下次调用update时发生。

答案 2 :(得分:2)

我遇到了同样的问题(使用Ext JS 4.1)。我还查看了两个控制器实例问题(可能对某人有帮助,在此处描述:http://www.sencha.com/forum/showthread.php?179105-Store-loads-amp-duplicates-records-but-API-only-called-once)但在我检查并确定我只有一个控制器实例化后,我正在寻找另一个解决方案。

nicolasbui 提示非常适合我。

以下是我从商店获取的代码:

listeners: {
    load: function(store, records, success, options) {
        console.log("Store: load event.");
    },
    scope: this,
    single: true
}

答案 3 :(得分:1)

ExtJS Store有一个suspendEvents方法,它暂停所有事件的触发,以及一个resumeEvents方法,它继续触发事件。我想你可以使用那些而不是删除和添加监听器 - 在我看来,这将是一种“更清洁”的方法。

答案 4 :(得分:1)

我的印象是你的双重火源是“函数改变商店中的某些值”。

我想在EditGridPanel中您可以编辑/更改A,B,C,D列,但处理程序中A,C的更改会对“E”中的某些值进行更改。在您的处理程序(someFunction)中确保来自A,B,C,D的变化不是来自E ......

我不知道您的代码以及someFunction中发生的事情 - >为什么它只是猜测

答案 5 :(得分:1)

任何事件都只能启动一次,因为iit会自动删除,布尔选项 true 。用它来实现它:

// as config
listeners: {
    update: {fn: somefunc, single: true }
}
// with adListener()/on()
cmp.on('update', myFunc, scope, { single: true });

此语法适用于Ext 3/4

真正的解决方案,如果你需要更新很多项目而只需要启动一个事件,只需使用提到的 suspendEvents()来暂停事件触发和 resumeEvents()取消暂停。只需在最后使用 fireEvent()即可。