2013-04-02 32 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(); 
} 
相关问题