2013-06-21 12 views
15

Voglio utilizzare this.get('controllers.pack.query'); per ottenere App.PackQueryController in App.PackController, ma non è riuscito.Ember.js Come ottenere controller nei bisogni che è nested controller Nome

Credo che il problema è Ember usare pack non pack.query come controllerName quando si cerca di ottenere il controllo. Anche se posso ottenere il controller da this.controllerFor('pack.query'), ma Ember dice che è deprecato, utilizzare needs invece

La mia mappa router piace qui sotto e ho definito needs: ['pack.query'] in App.PackController

App.Router.map(function() { 
    this.resource('pack', function() { 
     this.route('index', {path: '/:pack_id'}) 
     this.route('query'); 
    }); 
}); 

App.PackController = Ember.ObjectController.extend({ 
    needs: ['pack.query'], 
    queryPack: function() { 
     var packQueryCtrller = this.get('controllers.pack.query');    

     Ember.debug('packQueryCtrller: ' + packQueryCtrller); 
     //DEBUG: packQueryCtrller: undefined 

     packQueryCtrller.queryPack(); //faild packQuery is undefined 
    } 
}); 

App.PackQueryController = Ember.ArrayController.extend({ 
    queryPack: function (queryKey) { 
     //...do query pack 
    } 
}); 

risposta

16

Si dovrebbe usare cammello caso, not not notation per questo.

Il controller pacchetto dovrebbe essere

App.PackController = Ember.ObjectController.extend({ 
    needs: ['packQuery'], 
    queryPack: function() { 
    var packQueryCtrller = this.get('controllers.packQuery');    

    Ember.debug('packQueryCtrller: ' + packQueryCtrller); 
    //DEBUG: packQueryCtrller: undefined 

    packQueryCtrller.queryPack(); //faild packQuery is undefined 
    } 
}); 
+1

Questo fa non funziona post ember-cli 0.2.3. Guarda la risposta di @rog per una soluzione di lavoro. –

35

Ember.inject.controller() dovrebbero essere utilizzati per accedere a un controller. Usalo in questo modo:

Impostazione

... 
myController: Ember.inject.controller('pack'), 
nestedController: Ember.inject.controller('pack/query') 
... 

Ottenere

... 
this.get('myController'); 
this.get('nestedController'); 
... 

La risposta di cui sopra è stato aggiornato per riflettere il needsdeprecation a Ember 1.13.5 (rilasciato 19 Luglio 2015). Ho lasciato le vecchie risposte qui sotto, ma non dovrebbe essere usato a meno che tu non stia usando una versione precedente di Ember.


[deprecated] l'accesso ai controllori nidificati da altri controllori utilizzando needs:

Imposta needs sul controller:

... 
needs: ['pack/query'], 
... 

Poi accedervi utilizzando:

this.get('controllers.pack/query'); 

[deprecated] l'accesso ai controllori nidificate dalle rotte:

Idealmente, actions dovrebbero essere messi su un percorso. Se stai utilizzando lo schema needs descritto sopra nel tuo actions su un controller, prendi in considerazione il refactoring.

È possibile accedere ai controller annidati da un percorso utilizzando controllerFor in questo modo:

this.controllerFor('pack/query') 
+0

Aggiornato di nuovo per riflettere le nuove versioni (Ember 1.11.1 e ember-cli 0.2.3) – rog

+0

Grazie per questo, ci sono sorprendentemente poche informazioni là fuori su questo argomento e arrivare ad esso sembra essere una questione di inciampare ciecamente attraverso il buio. –

+0

Aggiornato di nuovo per riflettere una versione più recente (Ember 1.13.5) che ha introdotto un ritiro della risposta originale. – rog

Problemi correlati