Ext JS:TreeStore的beforeload事件未触发问题咨询
问题排查与解决
嘿,我来帮你捋捋这个TreeStore的beforeload事件没触发的问题:
首先,先揪出一个低级但致命的拼写错误——你在foo函数里写的是colsole.log,正确的应该是console.log!这个错误会导致就算函数真的被调用了,你也看不到任何日志输出,先把这个改过来再说。
接下来说说为什么用store.on绑定的事件没生效,而注释里的listeners配置却可以:
- 你在
constructor里的调用顺序有问题:先执行了this.callParent(arguments)(也就是父类TreeStore的构造函数),父类构造过程中已经完成了核心的初始化逻辑,甚至可能已经触发过beforeload相关的流程了,这时候你再用on去绑定事件,自然就错过了触发时机。 - 而
listeners是ExtJS组件原生支持的配置项,父类构造函数会在初始化的正确阶段自动处理这个配置里的事件绑定,时机完全匹配。
如果你非要坚持用on方法手动绑定事件,那得调整一下代码顺序,先绑定事件,再调用父类构造:
constructor: function (config) { var store = this; // 先绑定事件,再执行父类构造逻辑 store.on({ scope: store, beforeload: this.foo }); this.callParent(arguments); }
另外提个小建议:foo函数最好加上事件参数,这样后续如果需要操作store或者operation对象的话会更方便:
foo: function (store, operation) { console.log('foo called', store, operation); }
总结下来,最省心的方式还是用listeners配置项(就是你注释掉的那段代码),既符合ExtJS的组件规范,又不用操心绑定时机的问题~
内容的提问来源于stack exchange,提问作者Arno Voerman
相关产品推荐
相关产品推荐

