2013-04-02 29 views
5

我在extjs4.I工作,我陷入了一個點,我想在extjs4中動態地加載控制器。我使用控制器this.getController()方法來動態加載控制器。 * 當我將這段代碼放在特定控制器的init()函數中時,它會工作並且控制器會動態加載。 *這裏是我的控制器代碼...如何在extjs4中的特定事件調用中動態加載控制器?

Ext.define('B.UserController',{ 
---- 
init:function() 
{ 
    var controller = this.getController('kp.PollController'); 
    controller.init();     // launch init() method 
    this.control(
      { 
       'KpLogin button[action=loginAction]': 
         { 
          click:this.authenticateUser 
         }, 
      }); 
}, 
----- 

但是,當我把我的特別功能(按鈕事件)代碼,然後它給了我錯誤。 這裏是我的代碼...

Ext.define('B.UserController',{ 
    ------- 
    init:function() 
    { 
      this.control(
       { 
        'KpLogin button[action=loginAction]': 
          { 
           click:this.authenticateUser 
          }, 
       }); 
    }, 
    authenticateUser:function(button) 
    { 
     var controller = this.getController('kp.PollController'); 
     controller.init();     // launch init() method 
    } 
    ----- 

把這個代碼在此之後我的螢火錯誤...

Uncaught TypeError: Cannot read property 'readyState' of undefined Connection.js:818 
Ext.define.onStateChange Connection.js:818 
(anonymous function) 

這裏是我的app.js代碼....

Ext.application({ 
    name:'B', 
    autoCreateViewport:true, 
    controllers:['sn.UserController','qb.QbquestionController','kp.DnycontentController',/*'kp.PollController','kp.PolloptionController',*/'kp.KpquotationController','qb.QbqnsController','kp.CuriosityquestionController','kp.WordController','kp.DnycontentcategoriesController'], 
    launch:function() 
    { 
     console.log('Application launch'); 
    },//End of launch function 
    }); 

我不知道怎麼回事wrong.Please給我一些建議....

回答

0

爲Y你確定控制器尚未加載?因爲當你在控制器X的init函數中時,你不能確定控制器Y是否已經加載,並且它不會在該控制器的調用init()上拋出錯誤。

我想你需要請檢查是否控制器尚未加載:

if (!this.application.controllers.get(controllerName)) { 
    var controller = this.getController(controllerName); 
    controller.init();     
} 

因爲如果init已經被執行就不會工作,並拋出一個異常,像你這樣指出。

什麼在您的Ext.application()控制器陣列?

+0

thanks..johan您reply.Here我更新了我的代碼和我加入app.js代碼普萊舍檢查我遵循你的建議。但仍然沒有問題得到解決。 –

+0

我注意到我在Chrome中出現這個錯誤,但是這個錯誤在Firefox中沒有顯示。 –

0

我已經通過使用應用程序的getController來完成此工作,並且它工作得很好。

您必須通過在應用程序的定義中設置'addProperty'來將應用程序添加到您的全局變量中。 Here is exactly how

,然後調用控制器是這樣的:

MyApp.Current.getController('UserController'); 
0

難道說的scope是錯誤的?我相信在第一種情況下this是控制器。在後者中,this是按鈕。

無論是在初始化設置me = this,並參考me 或封閉事件處理程序這樣的功能:

'KpLogin button[action=loginAction]': 
{ 
    click: function() { 
     this.authenticateUser(); 
    } 

確保您通過arguments如果你還需要處理該事件。

我認爲還有第三種方法,爲該聽衆專門設置scope: this

'KpLogin button[action=loginAction]': 
{ 
    click: authenticateUser, 
    scope: this 
} 
0
Ext.application({ 

    launch: function() { 
     _myAppGlobal = this; 
    } 
}); 

var controller = _myAppGlobal.getController('kp.PollController'); 
0

你可以把下面的代碼中的authenticateUser功能

authenticateUser:function(button) { 
    var app = this.getApplication(), 
     controller = Ext.create('kp.PollController', { 
      application: app 
    }); 
    app.getControllerInstances()['kp.PollController'] = controller; 
    controller.init(); 
} 
相關問題