2013-04-02 15 views
5

Sto lavorando in extjs4.Io mi sto bloccando in un punto in cui voglio caricare il controller in modo dinamico in extjs4.Io sto usando il controller this.getController() per caricare il controller in modo dinamico. * Quando inserisco questo codice nella funzione init() di un controller particolare, funziona e il controller viene caricato dinamicamente. * Ecco il mio codice di controllo ...Come caricare dinamicamente il controller su una particolare chiamata di evento in 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 
         }, 
      }); 
}, 
----- 

Ma quando sto mettendo il mio codice, in particolare, la funzione (evento pulsanti), allora mi dà errore. Ecco il mio codice ...

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

Dopo aver messo questo codice in poi ho ottenuto l'errore in Firebug ...

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

Ecco il codice miei 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 
    }); 

non so cosa sta succedendo wrong.Please darmi qualche suggerimento ....

risposta

0

Are y sei sicuro che il controller non è stato ancora caricato? Perché quando si è nella funzione init del controller X non si può sapere con certezza se il controller Y è stato caricato e non genererà un errore nella chiamata init() di quel controller.

penso che avrete bisogno di controllare castrato il controller non ha ancora caricato:

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

Perché se l'init già è stato eseguito non funzionerà e un'eccezione, come è stato evidenziato.

Che cosa c'è nella matrice di controller del vostro Ext.application()?

+0

thanks..johan per il vostro reply.Here sto aggiornato il mio codice e sto aggiungendo app.js codice Plese controllarlo . Seguo il tuo suggerimento. Ma ancora non problema risolto. –

+0

Ho notato che ho ricevuto questo errore in chrome ma questo errore non è stato visualizzato in firefox .. –

0

Ho fatto questo utilizzando il getController dell'applicazione, e ha funzionato bene.

È necessario aggiungere l'applicazione alle variabili globali impostando 'addProperty' nella definizione dell'applicazione. Here is exactly how

e quindi chiamare il controller in questo modo:

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

Potrebbe essere che il scope è sbagliato? Credo che nel primo caso il controller sia this. In quest'ultimo, this è il pulsante.

entrambi i set me = this in init e si riferiscono a me o racchiudono il gestore di eventi in una funzione come questa:

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

assicurarsi di passare il arguments anche se è necessario gestire l'evento.

Penso che ci sia anche un terzo modo impostando specificamente lo scope: this per quel listener.

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

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

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

Si può mettere sotto codice nella funzione authenticateUser

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