2013-05-17 53 views
0

我只想在特殊情況下在運行時加載某些控制器。在這個視頻http://de.slideshare.net/senchainc/mvc-in-depth-part-2-tommy-maintz/據說你可以用getController來做到這一點。如果此時未裝入控制器,則會加載該文件並觸發控制器的初始化和啓動。getController()不加載文件,並且不會啓動init和lauch

但如果我試試這個:

var myController = this.getApplication().getController("MyController"); myController.test(); //-- Uncaught TypeError: Cannot call method 'test' of undefined

是myController的不確定和init和發射不會被觸發。

此功能在sencha 2.2中不存在嗎?我是否必須將所有控制器都包含在應用程序的「控制器」數組中?應用程序啓動後是否有其他方式來加載控制器?

+0

爲什麼你到底要什麼?只是好奇... – sha

+0

你打算在飛行中添加控制器嗎? Arent在啓動時定義了將在您的應用中使用的控制器數量? – Gendaful

回答

1

this.getApplication()沒有在Sencha Touch 2.x的幾個最新版本中使用。爲了得到你需要運行的應用程序實例:

yourAppName.app.getController(...)

0

您已經添加控制器在app.js文件控制器的列表?

示例代碼::

Ext.application({ 
    name: 'myApp', 
    requires:[ 
     'Ext.TitleBar' 
    ], 
    controllers: ['myDefaultController', 'onlyWhenCalledController', 'otherRandomController'], 
. . . . 
}); 

只有當你這樣做,那麼你可以使用getController功能。否則你所調用的控制器是未定義的。

除此之外,當然,您需要在應用程序的控制器文件夾下爲您的控制器使用相同名稱的工作代碼。當上述兩者都在您的應用程序中時,只有這樣您才能完成上述功能。

2

這樣做有幾個非常有道理的原因,其中最重要的不是所有的應用程序都必須首先加載,這可以加快速度。它還允許您僅根據用戶權限或用戶會話期間採取的操作來加載應用的某些部分。在我的桌面應用中,我有一些只能由管理員用戶看到的部分,因此我使用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' 
    ] 
相關問題