Як я можу надсилати мій об’єкт $ range з одного контролера на інший, використовуючи. $ Emit та. $ Методами?
Ви можете надіслати будь-який об’єкт, який ви хочете, в межах ієрархії вашого додатка, включаючи $ range .
Ось коротке уявлення про те, як працюють трансляція та емісія .
Помітьте вузли нижче; всі вкладені у вузол 3. Ви використовуєте трансляцію та випромінювання, коли у вас є цей сценарій.
Примітка . Кількість кожного вузла в цьому прикладі є довільною; це легко може бути номером один; число два; або навіть число 1348. Кожне число є лише ідентифікатором для цього прикладу. Суть цього прикладу - показати вкладення кутових контролерів / директив.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Ознайомтесь із цим деревом. Як ви відповідаєте на наступні запитання?
Примітка. Є інші способи відповісти на ці запитання, але тут ми обговоримо трансляцію та емісію . Також, читаючи нижче тексту, припустимо, що кожне число має власний файл (директива, контролер) ex one.js, two.js, three.js.
Як вузол 1 розмовляє з вузлом 3 ?
У файлі one.js
scope.$emit('messageOne', someValue(s));
У файлі three.js - самий верхній вузол для всіх дитячих вузлів, необхідних для спілкування.
scope.$on('messageOne', someValue(s));
Як вузол 2 розмовляє з вузлом 3?
У файлі two.js
scope.$emit('messageTwo', someValue(s));
У файлі three.js - самий верхній вузол для всіх дитячих вузлів, необхідних для спілкування.
scope.$on('messageTwo', someValue(s));
Як вузол 3 розмовляє з вузлом 1 та / або вузлом 2?
У файлі three.js - самий верхній вузол для всіх дитячих вузлів, необхідних для спілкування.
scope.$broadcast('messageThree', someValue(s));
У файлі one.js && two.js залежно від того, в якому файлі ви хочете ввести повідомлення або те і інше.
scope.$on('messageThree', someValue(s));
Як вузол 2 розмовляє з вузлом 1?
У файлі two.js
scope.$emit('messageTwo', someValue(s));
У файлі three.js - самий верхній вузол для всіх дитячих вузлів, необхідних для спілкування.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
У файлі one.js
scope.$on('messageTwo', someValue(s));
ЗАРАЗ
Коли у вас є всі ці вкладені дочірні вузли, які намагаються спілкуватися так, ви швидко побачите багато $ , трансляцій та $ емісій .
Ось що я люблю робити.
У самому верхньому РІЗНІ РОЗВИТКУ ( 3 у цьому випадку ...), який може бути вашим батьківським контролером ...
Отже, у файлі three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Тепер у будь-якому з дочірніх вузлів вам потрібно лише $ $ надіслати повідомлення або зафіксувати його, використовуючи $ on .
ПРИМІТКА: Зазвичай перетинати розмову в одному вкладеному контурі досить легко, не використовуючи $ emit , $ Broadcast або $ on , що означає, що більшість випадків використання є для того, щоб ви намагаєтеся отримати вузол 1 для зв'язку з вузлом 2 або навпаки.
Як вузол 2 розмовляє з вузлом 1?
У файлі two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
У файлі three.js - самий верхній вузол для всіх дитячих вузлів, необхідних для спілкування.
Ми вже з цим справлялися, пам’ятаєте?
У файлі one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Вам все одно потрібно буде використовувати $ on з кожним конкретним значенням, яке ви хочете впіймати, але тепер ви можете створювати все, що завгодно, в будь-якому з вузлів, не турбуючись про те, як передати повідомлення через розрив батьківського вузла, коли ми вловлюємо та транслюємо загальні pushChangesToAllNodes .
Сподіваюся, це допомагає ...
$rootScope
для трансляції / випромінювання, коли цього можна уникнути.