這樣做有幾個非常有道理的原因,其中最重要的不是所有的應用程序都必須首先加載,這可以加快速度。它還允許您僅根據用戶權限或用戶會話期間採取的操作來加載應用的某些部分。在我的桌面應用中,我有一些只能由管理員用戶看到的部分,因此我使用MyApp.app.getController('AppControllerAdministration')來獲取類加載器以加載管理控制器。
SashaZd的評論其實是不正確的,至少在我的經驗。我從應用程序中的「controllers」數組中刪除控制器,並使用getController強制加載它。否則它會在應用程序啓動時出現,這是我認爲OP試圖避免的原因。至少在4.2.2中(使用Sencha Architect 3),對我而言,也適用於從app.js.中刪除對該控制器專用的任何商店,視圖或模型的引用。然後,您可以將它們放在控制器的「視圖」,「模型」和「存儲」配置中(例如在帖子末尾)。因此,在我的應用程序中,如果我檢查權限並且用戶是管理員,則爲管理UI創建控制器,並且還需要加載所需的所有商店,視圖和模型。但是,除非我這樣做,否則他們不在。你可以看他們在調試器中加載。
注意:這意味着您可能需要顯式加載商店或創建您的視圖,因爲它們可能不會自動創建。同樣在開發模式下,ExtJS會「推薦」你將它們放在app.js中,你需要忽略它。消息如「[Ext.Loader]同步加載'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'
]
爲什麼你到底要什麼?只是好奇... – sha
你打算在飛行中添加控制器嗎? Arent在啓動時定義了將在您的應用中使用的控制器數量? – Gendaful