Joh*_*all 7 extjs extjs4 extjs-mvc
EXTJS 4.1
我遇到了一个难题,并希望听到其他开发人员关于ExtJS事件和控制器方法的情况.我理解这个主题已经在很多场合被讨论和辩论,但我觉得它可以使用更多钻研.
按照标准做法,我在Controller的init()方法声明中定义事件监听器,如下所示:
Ext.define("My.controller.Awesome", {
init: function(application){
/** Observe some Views */
this.control({
'my-awesome-view #saveButton':{
click: this.saveMyData
}
});
/** Listen for Events, too! */
this.on({
showAwesomeView: this.showMyAwesomeView
});
/** Application events, what fun! */
this.application.on({
showThatAwesomeView: this.showMyAwesomeView
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我愉快地去了解一些其他的控制器编码的一些功能,我觉得自己需要调用showMyAwesomeView的My.controller.Awesome.我可以用几种不同的方式做到这一点......
Ext.define("My.controller.Other", {
/* ... class definition */
someImportant: function(){
// I can do this (Approach #1)
this.application.getController("Awesome").showMyAwesomeView();
// Or I can do this (Approach #2)
this.application.getController("Awesome").fireEvent("showAwesomeView");
// Last but not least, I can do this (Approach #3)
this.application.fireEvent("showThatAwesomeView");
}
});
Run Code Online (Sandbox Code Playgroud)
对我而言,方法#3 感觉最"正确".我的问题是,如果我没有实例化My.controller.Awesome之前的init()方法,该方法尚未运行,因此没有建立听众,因此被触发的事件进入神秘的土地,再也听不到了.
我在返回之前已经重载Ext.application.getController()调用,因此控制器在加载时会调用其方法(通常作为另一个控制器中的依赖项).这不好吗?controller.init()controllerinit
为了节省加载时间(我的应用程序非常大),我的控制器及其依赖项是根据需要加载的.因此,当我的应用程序首次启动时,我的大多数控制器(以及视图和数据存储)都没有实例化,因此不是init()'ed,这使得触发应用程序范围的事件非常麻烦.
我觉得我可能会遗漏一些大的东西,或者我只需要咬紧牙关并确保我的控制器在触发事件之前已经初始化.我想我也可以在主应用程序文件中放置一个绝对可怕数量的事件监听器,并在相应地调用它们的方法之前处理init'ing控制器,但这看起来非常草率并且难以维护.
任何意见都将不胜感激,谢谢您的时间!
方法 #3 (this.application.fireEvent('showThatAwesomeView')) 是一个很好的解决方案。应用程序事件的使用导致控制器无法假设可以从与该事件相关的应用程序中添加或删除哪些其他逻辑。
关于您对控制器是否及时实例化以正确绑定到事件的担忧,使用 Ext.app.Application 控制器将消除这种情况。App控制器在App初始化时会初始化所有指定的控制器。您注意到与控制器数量相关的启动时间问题。我曾开发过许多单页应用程序,在某些情况下这些应用程序有数十个甚至数百个控制器。将任何初始化逻辑保持在最低限度应该可以减少任何明显的减速。缩小和组合的脚本代替按需加载,可以很好地保持应用程序的快速启动。
避免使用 getController 方法是一个很好的做法。当使用应用程序事件代替将控制器彼此紧密耦合的逻辑时,应用程序逻辑往往会更好地组织。