2013-04-02 3 views
5

Ich arbeite in extjs4.Ich bin stecken an einem Punkt, wo ich Controller in extjs4 dynamisch laden möchte. Ich verwende Controller this.getController() -Methode, um Controller dynamisch zu laden. * Wenn ich diesen Code in init() - Funktion eines bestimmten Controllers platziere, dann funktioniert es und der Controller wird dynamisch geladen. * Hier ist mein Controller-Code ...Wie kann der Controller bei bestimmten Ereignisaufrufen in extjs4 dynamisch geladen werden?

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

Aber wenn ich meinen Code in bestimmten Funktion (Tasten-Ereignisse) am platzieren dann es gibt mir Fehler. Hier ist mein Code ...

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

Nach diesen Code in dann Platzierung habe ich Fehler in Firebug ...

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

Hier Code meine 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 
    }); 

ich weiß nicht, was los ist wrong.Please geben Sie mir einige Vorschläge ....

Antwort

0

y Sind Bist du sicher, dass der Controller noch nicht geladen wurde? Denn wenn Sie in der Init-Funktion von Controller X sind, können Sie nicht sicher sein, ob der Controller Y geladen wurde und es wird kein Fehler auf den init() Aufruf dieses Controllers geworfen.

Ich denke, Sie müssen überprüfen, ob Ihr Controller noch nicht geladen ist:

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

Denn wenn die init bereits ausgeführt wurde es nicht funktionieren wird und eine Ausnahme auslösen, wie Sie wies darauf hin.

Was ist in der Controller-Array Ihrer Ext.application()?

+0

thanks..johan für Ihre reply.Here Ich bin meinen Code aktualisiert, und ich bin das Hinzufügen app.js Code Plese es überprüfen .Ich folge deinem Vorschlag.Aber noch kein Problem gelöst werden. –

+0

Ich habe festgestellt, dass ich diesen Fehler in Chrome bekam, aber dieser Fehler nicht in Firefox angezeigt .. –

0

Ich habe dies mit dem getController der Anwendung getan, und es hat gut funktioniert.

Sie müssen die Anwendung zu Ihren globalen Variablen hinzufügen, indem Sie 'addProperty' in der Anwendungsdefinition festlegen. Here is exactly how

Und dann den Controller wie folgt aufrufen:

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

es, dass die scope falsch sein könnte, ist? Ich glaube, als im ersten Fall this ist der Controller. In letzterem ist this der Knopf.

gesetzt Entweder me = this in init und beziehen sich auf me oder den Event-Handler wie dies in einer Funktion einschließen:

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

Achten Sie darauf, die arguments passieren, wenn Sie auch das Ereignis behandeln müssen.

Ich denke, es gibt auch einen dritten Weg, indem Sie speziell die scope: this für diesen Hörer einstellen.

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

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

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

Sie können unter Code in der Funktion authenticateUser setzen

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