我有一个可编辑的Ext网格面板。它使用的商店有一个监听器,可以在更改记录时触发函数:
listeners:{
update: someFunction
},
该函数会更改商店中的某些值,因此会再次触发该函数。 有没有办法运行该功能一次? 也许要使用另一个听众?
答案 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()即可。