如何在extjs4中的特定事件调用上动态加载控制器?

时间:2013-04-02 06:43:54

标签: extjs extjs4 extjs4.1 extjs-mvc

我正在使用extjs4。我遇到了我想在extjs4中动态加载控制器的问题。我使用控制器this.getController()方法动态加载控制器。 * 当我将此代码放在特定控制器的init()函数中时,它会工作,控制器会动态加载。 *这是我的控制器代码......

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
    }
    -----

将此代码放入后,我在firebug中出错...

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
     });

我不知道哪里出错了。请给我一些建议......

5 个答案:

答案 0 :(得分:0)

您确定尚未加载控制器吗?因为当你在控制器X的init函数中时,你无法确定控制器Y是否已经加载,并且它不会在该控制器的init()调用上引发错误。

我认为您需要检查控制器是否尚未加载:

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

因为如果init已经被执行了,它将无法工作并抛出一个异常,就像你指出的那样。

Ext.application()的控制器数组中有什么?

答案 1 :(得分:0)

我是通过使用Application的getController来完成的,它运行得很好。

您必须通过设置" addProperty'将应用程序添加到全局变量中。关于应用程序的定义。 Here is exactly how

然后像这样调用控制器:

MyApp.Current.getController('UserController');

答案 2 :(得分:0)

可能是scope错了吗?我相信比第一种情况this是控制器。在后者中,this是按钮。

在init中设置me = this并引用me 或者将事件处理程序包含在这样的函数中:

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

如果您还需要处理此事件,请务必通过arguments

我认为通过为该听众专门设置scope: this,还有第三种方式。

'KpLogin button[action=loginAction]':
{
   click: authenticateUser,
   scope: this
}

答案 3 :(得分:0)

Ext.application({

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

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

答案 4 :(得分:0)

您可以将以下代码放在authenticateUser函数

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