Jak mogę wysłać mój obiekt $ scope z jednego kontrolera do drugiego za pomocą metod. $ Emit i. $ Na metodach?
Możesz wysłać dowolny obiekt w hierarchii swojej aplikacji, w tym $ scope .
Oto krótki pomysł na temat sposobu nadawania i emitowania .
Zwróć uwagę na poniższe węzły; wszystkie zagnieżdżone w węźle 3. Korzystasz z rozgłaszania i emisji, gdy masz taki scenariusz.
Uwaga: Liczba każdego węzła w tym przykładzie jest dowolna; z łatwością może być numerem jeden; numer dwa; lub nawet liczba 1348. Każda liczba jest tylko identyfikatorem dla tego przykładu. Celem tego przykładu jest pokazanie zagnieżdżenia kontrolerów / dyrektyw Angular.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Sprawdź to drzewo. Jak odpowiesz na następujące pytania?
Uwaga: istnieją inne sposoby odpowiedzi na te pytania, ale tutaj omówimy transmisję i emisję . Ponadto, czytając poniższy tekst, załóż, że każdy numer ma własny plik (dyrektywę, kontroler) np. One.js, two.js, three.js.
Jak węzeł 1 przemawia do węzła 3 ?
W pliku one.js
scope.$emit('messageOne', someValue(s));
W pliku three.js - najwyższy węzeł do wszystkich węzłów potomnych potrzebnych do komunikacji.
scope.$on('messageOne', someValue(s));
Jak węzeł 2 mówi do węzła 3?
W pliku two.js
scope.$emit('messageTwo', someValue(s));
W pliku three.js - najwyższy węzeł do wszystkich węzłów potomnych potrzebnych do komunikacji.
scope.$on('messageTwo', someValue(s));
Jak węzeł 3 przemawia do węzła 1 i / lub węzła 2?
W pliku three.js - najwyższy węzeł do wszystkich węzłów potomnych potrzebnych do komunikacji.
scope.$broadcast('messageThree', someValue(s));
W pliku one.js && two.js, w zależności od tego, który plik chcesz przechwycić, lub jedno i drugie.
scope.$on('messageThree', someValue(s));
Jak węzeł 2 przemawia do węzła 1?
W pliku two.js
scope.$emit('messageTwo', someValue(s));
W pliku three.js - najwyższy węzeł do wszystkich węzłów potomnych potrzebnych do komunikacji.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
W pliku one.js
scope.$on('messageTwo', someValue(s));
JEDNAK
Kiedy wszystkie te zagnieżdżone węzły podrzędne będą próbowały komunikować się w ten sposób, szybko zobaczysz wiele $ on , $ broadcast i $ emit .
Oto co lubię robić.
W górnej węzeł nadrzędny ( 3 w tym przypadku ...), którym może być kontroler rodzic ...
Tak więc w pliku three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Teraz w dowolnym węźle podrzędnym wystarczy tylko $ wyemitować wiadomość lub złapać ją za pomocą $ on .
UWAGA: Zwykle dość łatwo jest rozmawiać krzyżowo w jednej zagnieżdżonej ścieżce bez użycia $ emit , $ broadcast lub $ on , co oznacza, że większość przypadków użycia występuje, gdy próbujesz zmusić węzeł 1 do komunikacji z węzłem 2 lub odwrotnie.
Jak węzeł 2 przemawia do węzła 1?
W pliku two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
W pliku three.js - najwyższy węzeł do wszystkich węzłów potomnych potrzebnych do komunikacji.
Już sobie z tym poradziliśmy, pamiętasz?
W pliku one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Nadal będziesz musiał użyć $ on dla każdej konkretnej wartości, którą chcesz złapać, ale teraz możesz tworzyć, co chcesz w dowolnym z węzłów, nie martwiąc się o to, jak przekazać wiadomość przez lukę węzła nadrzędnego, gdy łapiemy i transmitujemy ogólne pushChangesToAllNodes .
Mam nadzieję że to pomoże...
$rootScope
do nadawania / emitowania, gdy można tego uniknąć.