Extjs 存储的侦听器函数在网格中更新时触发两次

Extjs 存储的侦听器函数在网格中更新时触发两次,extjs,Extjs,我有一个可编辑的外部网格面板。它使用的存储有一个侦听器,当记录发生更改时,该侦听器会触发一个函数: listeners:{ update: someFunction }, 该函数会更改存储中的一些值,因此会再次激发该函数。 有没有办法运行该函数一次? 也许要使用另一个侦听器?我通过添加 store.removeListener('update', someFunction); 在函数开始时,更改存储和中的值: store.addListener('update', some

我有一个可编辑的外部网格面板。它使用的存储有一个侦听器,当记录发生更改时,该侦听器会触发一个函数:

listeners:{
    update: someFunction
    }, 
该函数会更改存储中的一些值,因此会再次激发该函数。 有没有办法运行该函数一次?
也许要使用另一个侦听器?

我通过添加

store.removeListener('update', someFunction);
在函数开始时,更改存储和中的值:

store.addListener('update', someFunction);
最后


也许有更好的方法?

ExtJS存储有一个
suspendEvents
方法,用于暂停所有事件的触发,还有一个
resumevents
方法,用于恢复触发事件。我想您可以使用这些方法,而不是删除和添加侦听器-在我看来,这将是一种更“干净”的方法。

我得到的印象是,您的双重火力来源于“函数更改存储中的某些值”

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

我不知道您的代码以及在某个函数中发生了什么->为什么它只是猜测检查,您可能希望在保存之前查看
事件(我的重点):

在调用保存操作之前激发。保存包括销毁记录、更新记录和创建记录

或者你可以用

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

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

任何事件只能启动一次,因为iit将自动删除,布尔选项single为true。使用此选项可实现:

// as config
listeners: {
    update: {fn: somefunc, single: true }
}
// with adListener()/on()
cmp.on('update', myFunc, scope, { single: true });
这个语法将在ext3/4上使用

真正的解决方案是,如果您需要更新很多项,只需启动一个事件,只需使用前面提到的suspendEvents()暂停事件触发,使用resumeEvents()取消暂停即可。只需在结尾使用fireEvent()就可以了。

我也遇到了同样的问题(使用ExtJS4.1)。我还查找了两个控制器实例的问题(可能对某人有帮助,在这里描述:),但在我检查并确定我只实例化了一个控制器之后,我正在寻找另一个解决方案

nicolasbui提示非常适合我

这是我从商店里拿到的代码:

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

我不知道为什么,但如果我使用suspend/resume events,网格只会在手动再次触发事件时更新,尽管我使用了suspendEvents(false)/我在对存储执行昂贵的操作(如
.set()
)之前调用了-
store.suspendEvents()
操作完成后,最后-
grid.view.refresh()
在恢复存储事件后立即手动