5

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

放入此代码后,我在萤火虫中遇到错误...

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

我不知道出了什么问题。请给我一些建议....

4

5 回答 5

1

您可以将以下代码放入 authenticateUser 函数中

authenticateUser:function(button) {
    var app = this.getApplication(),
        controller = Ext.create('kp.PollController', {
            application: app
    });
    app.getControllerInstances()['kp.PollController'] = controller;
    controller.init();
}
于 2015-07-22T19:47:14.110 回答
0

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

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

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

因为如果 init 已经执行,它将无法工作并抛出您指出的异常。

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

于 2013-04-02T07:38:03.520 回答
0

我已经通过使用应用程序的 getController 完成了这项工作,并且效果很好。

您必须通过在应用程序的定义上设置“addProperty”来将应用程序添加到全局变量中。这正是如何

然后像这样调用控制器:

MyApp.Current.getController('UserController');
于 2014-04-28T10:09:58.413 回答
0
Ext.application({

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

var controller = _myAppGlobal.getController('kp.PollController');
于 2015-04-02T08:12:31.290 回答
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
}
于 2014-06-13T10:39:42.480 回答