2013-02-07 11 views
5

Próbuję powiązać w ApplicationController z IndexController. Here is my jsfiddle. Podsumowując, jest tu wiązanie mam w kontrolerze aplikacjiEmber.js: powiązanie danych między kontrolerami

indexIsClickedBinding: "App.indexController.isClicked", 

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

Więc, kiedy isClicked wartość w IndexController ulega zmianie, ale indexIsClickedBinding nic nie robi. Jakieś sugestie co jest nie tak w moim kodzie?

Pozdrowienia

Odpowiedz

23

Chociaż rozwiązanie jest proste, pozwól mi spróbować wyjaśnić. Jeśli nie masz pewności, zadaj dowolne pytania.

Masz powiązanie z usługą na instancji z App.indexController. Jednak to wystąpienie nie istnieje, ponieważ Ember.JS nie umieszcza już instancji kontrolerów bezpośrednio na App.

on używany do przebywania na App w poprzednich wersjach Ember, ale nie dłużej, bo to zła praktyka, aby odwoływać się do kontrolera przy użyciu jego nazwy absolutną, ponieważ tworzy tight coupling pomiędzy kontrolerami.

Dlatego właśnie Ember.JS ma inne sposoby odniesienia do kontrolerów. Powszechnym wymogiem jest potrzeba innych kontrolerów w twoim bieżącym kontrolerze. Ember.js mają następujące metody:

Dlatego, jeśli implementujemy needs, Twój kontroler ma teraz dostęp do drugiego kontrolera, a także właściwości, które posiada: http://jsfiddle.net/uB5tX/7/

Korzystając z needs, mamy luźno sprzężone sterowniki. Odwoływaliśmy się do niego po nazwie, a Ember.JS będzie sprawdzał dla nas kontroler. Jeśli zmienimy App, nie będziemy musieli zmieniać niczego, a jeśli/kiedy Ember.JS zmieni zachowanie kontrolerów, nie będziemy musieli ponownie aktualizować naszego needs, ponieważ gdy zachowanie się zmieni, to aktualizacja zostanie również zaktualizowana needs , przywracając prawidłowy kontroler.

+0

Bardzo dziękuję !. Więc jeśli nie możesz zrobić aplikacji.someController, jak to działa teraz w szablonach z #each, np .: ** {{# each app.someController}} **? –

+1

Nie ma potrzeby określania części 'Controller', jeśli używasz podejścia' needs'. Jeśli 'IndexController'' potrzebuje '' AnotherController' to w 'IndexController' po prostu nazwałbyś to: 'controllers.another'. To samo dotyczy widoków: '#each controllers.another'. – Wildhoney

+0

ok. Ostatnia sytuacja. Co powiesz na ArrayController, w jaki sposób przejdziesz przez to. W [tym] (http://jsfiddle.net/ud3323/4ysxQ/) skrzypce wciąż robią to staro i nie mogę go uruchomić w [tym] (http://jsfiddle.net/jeanluca/ uB5tX/9 /) fiddle –

0

Można również użyć następującej składni, aby uzyskać dostęp do właściwości innego kontrolera:

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

Jednak trzeba dokonać Ember zainicjować ten kontroler pierwszy, więc rzeczywiście trzeba nazwać jakąś właściwość komputerowej, która zależy od index (ja leniwie go zainicjuj). Tak więc, na przykład w szablonie używam:

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

Working demo.