2013-04-02 17 views
5

Pracuję w extjs4. Utknąłem w punkcie, w którym chcę dynamicznie ładować kontroler w extjs4. Używam kontrolerów this.getController() do dynamicznego ładowania kontrolera. * Kiedy umieszczam ten kod w funkcji init() konkretnego kontrolera, to działa i kontroler jest ładowany dynamicznie. * Oto mój kod kontrolera ...Jak załadować kontroler dynamicznie na konkretne wywołanie zdarzenia w 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 
         }, 
      }); 
}, 
----- 

Ale kiedy jestem umieszczenie mojego kodu w szczególności funkcji przycisków (zdarzenia), to daje mi błąd. Oto mój kod ...

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

Po umieszczeniu tego kodu w czym mam błąd w Firebug ...

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

Oto kod moi 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 
    }); 

nie wiem co się dzieje wrong.Please dać mi kilka wskazówek ....

Odpowiedz

0

Czy y jesteś pewien, że kontroler nie został jeszcze załadowany? Ponieważ, gdy jesteś w funkcji inicjowania kontrolera X, nie możesz wiedzieć na pewno, czy kontroler Y załadował się i nie wyśle ​​błędu w wywołaniu tego kontrolera przez init().

myślę, że trzeba sprawdzić pogoda kontroler nie została jeszcze załadowana:

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

Bo jeśli init już został wykonany nie będzie działać, a wyjątek jak pan zauważył.

Co w tablicy kontrolerów twojego Ext.application()?

+0

thanks..johan dla reply.Here mam zaktualizowany mój kod i dodaję app.js kod Plese to sprawdzić .Zgadzam się z twoją sugestią. Ale nadal nie problem zostanie rozwiązany. –

+0

Zauważyłem, że mam ten błąd w chrome, ale ten błąd nie jest wyświetlany w Firefox .. –

0

Zrobiłem to za pomocą getController aplikacji i działało dobrze.

Musisz dodać aplikację do zmiennych globalnych, ustawiając "addProperty" w definicji aplikacji. Here is exactly how

a następnie wywołać kontrolera takiego:

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

to może być, że scope jest źle? Uważam, że w pierwszym przypadku kontrolerem jest this. W tym ostatnim znajduje się przycisk.

Albo ustawić me = this w init i odnoszą się do me lub dołączyć obsługi zdarzeń w funkcji takich jak to:

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

Upewnij się zdać arguments jeśli trzeba także obsługiwać zdarzenia.

Myślę, że istnieje również trzecia droga, ustawiając specjalnie dla tego słuchacza scope: this.

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

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

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

można umieścić poniżej kod w funkcji authenticateUser

authenticateUser:function(button) { 
    var app = this.getApplication(), 
     controller = Ext.create('kp.PollController', { 
      application: app 
    }); 
    app.getControllerInstances()['kp.PollController'] = controller; 
    controller.init(); 
} 
Powiązane problemy