2013-02-07 22 views
5

Sto cercando di associare ApplicationController a IndexController. Here is my jsfiddle. Per riassumere, qui è il legame che ho nel controller ApplicationEmber.js: associazione dati tra controllori

indexIsClickedBinding: "App.indexController.isClicked", 

isIndexClicked: function() { 
    alert("its changed to " + this.get("indexIsClicked")) ; 
}.observes('indexIsClicked'), 

Così, quando il isClicked valore nel IndexController è cambiato, ma l'indexIsClickedBinding non fa nulla. Qualche suggerimento che cosa è sbagliato nel mio codice?

Acclamazioni

risposta

23

Mentre la soluzione è semplice, mi permetta di provare e spiegarlo. Non esitate a fare domande se non siete sicuri.

Sei collegato a una proprietà su un'istanza di App.indexController. Tuttavia, questa istanza non esiste, poiché Ember.JS non colloca più direttamente l'istanza dei controller su App.

ha usato per risiedere su App nelle versioni precedenti di Ember, ma non più, perché è cattiva pratica per fare riferimento a un controller utilizzando il suo nome in assoluto, in quanto crea tight coupling tra i controller.

Ecco perché Ember.JS hanno altri modi per fare riferimento ai controllori. È un requisito comune richiedere altri controller nel controller corrente. Ember.JS hanno i seguenti metodi:

Pertanto, se implementiamo l'needs, quindi il controller ha ora accesso all'altro controller, nonché alle proprietà che possiede: http://jsfiddle.net/uB5tX/7/

Utilizzando lo needs, abbiamo agganciato i controller senza stringere. L'abbiamo fatto riferimento per nome e Ember.JS cercherà il controller per noi. Se cambiamo App allora non avremo bisogno di cambiare nulla, e se/quando Ember.JS modifica il comportamento dei controllori, che non dovrebbe aver bisogno di aggiornare la nostra needs di nuovo, perché quando i cambiamenti di comportamento, allora l'needs potranno anche aggiornare , riportando il controller corretto.

+0

grazie mille !. Quindi se non puoi fare App.someController, come funziona ora nei template con #each, come: ** {{# ogni App.someController}} **? –

+1

Non è necessario specificare la parte 'Controller', se si utilizza l'approccio' needs'. Se 'IndexController'' ha bisogno di '' AnotherController' allora in 'IndexController' lo si farà semplicemente riferimento come:' controllers.another'. Lo stesso vale per le visualizzazioni: '#each controllers.another'. – Wildhoney

+0

ok. Un'ultima situazione. Che ne dici di un controller Array, come faresti a scorrere questo. In [questo] (http://jsfiddle.net/ud3323/4ysxQ/) violino fanno ancora il vecchio, e non riesco a farlo funzionare in [questo] (http://jsfiddle.net/jeanluca/ uB5tX/9 /) fiddle –

0

Si potrebbe anche usare sintassi seguente per accedere alle proprietà di altri controller:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    index: Ember.inject.controller('index'), 
    indexIsClicked: Ember.computed.alias("index.isClicked"), 

    isIndexClicked: Ember.observer('index.isClicked', function() { 
    alert("its changed to " + this.get("indexIsClicked")); 
    }) 
}); 

Tuttavia è necessario fare Ember inizializzare questo controller prima, quindi è in realtà necessario chiamare qualche proprietà calcolata che dipende index (lo farà inizializzarlo pigramente). Così, per esempio nel modello che uso:

Is index clicked: <b>{{indexIsClicked}}</b> 

Working demo.

Problemi correlati