这样做有几个非常正当的理由,其中最重要的一点是,并非所有应用程序都必须最初加载,这可以加快速度。它还允许您仅根据用户权限或用户会话期间采取的操作来加载应用程序的某些部分。在我的桌面应用程序中,我的部分只能由管理员用户看到,所以我使用 MyApp.app.getController('AppControllerAdministration') 来让类加载器加载管理控制器。
SashaZd 的评论实际上是不正确的,至少在我的经验中是这样。我从应用程序的“控制器”数组中删除控制器,并使用 getController 强制它加载。否则它会在应用程序启动时出现,这是我认为 OP 试图避免的。至少在 4.2.2(使用 Sencha Architect 3)中,对我有用的是从 app.js 中删除对该控制器专用的任何商店、视图或模型的引用。然后,您可以将它们放在控制器的“视图”、“模型”和“存储”配置中(示例在帖子末尾)。因此,在我的应用程序中,如果我检查权限并且用户是管理员,我会创建用于管理 UI 的控制器,并且它需要加载的所有商店、视图和模型也会被加载。但在我这样做之前,它们并不存在。
注意:这意味着您可能需要显式加载您的商店或创建您的视图,因为它们可能不会自动创建。同样在开发模式下,ExtJS 会“推荐”你将它们放在 app.js 中,你需要忽略它。“[Ext.Loader] Synchronously loading 'MyApp.controller.EditUserController'; 考虑在 Ext.onReady 上方添加 Ext.require('MyApp.controller.EditUserController')”之类的消息实际上正是您想要的!
您还可以选择根据用户操作加载控制器。我在 AppControllerAdministration.js 中使用下拉列表的值来执行此操作:
var controllerName = 'MyApp.controller.Edit' + resourceType + 'Controller',
newController = this.application.getController(controllerName),
要小心,您需要确保 newController 实际上已正确加载。
作为所有这一切的一个例子,这里是我的控制器声明的开头:
Ext.define('MyApp.controller.AppControllerAdministration', {
extend: 'Ext.app.Controller',
models: [
'Resource',
'EditorSection',
'Permission',
'Role'
],
stores: [
'Resources',
'Roles',
'Users',
'Routes'
],
views: [
'EditRoles',
'EditUsers',
'EditRoutes'
]