2013-04-02 2 views
5

Я работаю в extjs4.Я застрял в точке, где я хочу динамически загружать контроллер в 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

ли у Убедитесь, что контроллер еще не загружен? Поскольку, когда вы находитесь в функции init контроллера X, вы не можете точно знать, загружен ли контроллер Y, и он не будет вызывать ошибку при вызове init() этого контроллера.

Я думаю, что вам нужно, чтобы проверить погоду контроллер еще не загружен:

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

Потому что, если инициализации уже были выполнены не будет работать, и выбросить исключение, как вы указали.

Что находится в массиве контроллеров вашего Ext.application()?

+0

thanks..johan для reply.Here Я обновил свой код и я добавляю app.js код Plese проверить его . Я следую вашему предложению. Но проблема не решена. –

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