Чому ми використовуємо $ rootScope. $ Мовлення в AngularJS?


109

Намагався знайти основну інформацію для AngularJS $rootScope.$broadcast, але документація AngularJS не дуже допомагає. Простими словами, чому ми використовуємо це?

Крім того, всередині шаблону " гаряче рушник" Джона Папи є звичайна функція в загальному модулі під назвою $broadcast:

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

Я не зрозумів, що це робить. Ось ось кілька основних питань:

1) Що робить $rootScope.$broadcast?

2) Яка різниця між $rootScope.$broadcastта $rootScope.$broadcast.apply?




$rootScope.$broadcast.apply()використовується тому, що якщо ви хочете передати спеціальний argumentsоб’єкт іншій функції, вам потрібно скористатися apply()(на відміну від call()). Окрім посилання @ Blackhole на сторінку MDN при застосуванні, ви також можете перевірити запис на arguments.
Скотт Шупбах

Відповіді:


97
  1. Що робить $rootScope.$broadcast?

    $rootScope.$broadcastнадсилає подію через область застосування. Будь-які діти обсяг цієї програми може зловити його з допомогою простого: $scope.$on().

    Особливо корисно надсилати події, коли ви хочете досягти сфери, яка не є прямим батьківським (наприклад, гілка батьків)

    !!! Одне, однак не робити, це використовувати $rootScope.$onконтролер. $rootScopeце додаток, коли ваш контролер буде знищений, той слухач подій все ще буде існувати, і коли ваш контролер буде створений знову, він просто накопичить більше слухачів подій. (Так одна трансляція буде спіймана кілька разів). Використовуйте $scope.$on()натомість, і слухачі також будуть знищені.

  2. Яка різниця між $rootScope.$broadcast& $rootScope.$broadcast.apply?

    Іноді доводиться використовувати apply(), особливо при роботі з директивами та іншими бібліотеками JS. Однак, оскільки я не знаю цієї кодової бази, я не зміг би сказати, чи так це тут.


11
Відмінний вилов на $rootScope.$onвитік пам'яті. Це стосується і прийнятої відповіді, оскільки, швидше за все, контролери називатимуть hiEventServiceствореного ним.
adamdport

Який приклад, де ви б використовували $broadcastvs.$broadcast.apply()
гість

$ rootScope. $ трансляція події передає подію всім слухачам, а не лише слухачам із дитячих областей. $
range

157

$rootScope в основному функціонує як слухач подій та диспетчер.

Щоб відповісти на питання про те, як воно використовується, воно застосовується спільно з rootScope.$on;

$rootScope.$broadcast("hi");

$rootScope.$on("hi", function(){
    //do something
});

Однак це погана практика використовувати $rootScopeяк загальну службу подій вашого власного додатка, оскільки ви швидко опинитесь у ситуації, коли кожен додаток залежить від $ rootScope, і ви не знаєте, які компоненти слухають, які події.

Найкраща практика - створити сервіс для кожної спеціальної події, яку ви хочете слухати чи транслювати.

.service("hiEventService",function($rootScope) {
    this.broadcast = function() {$rootScope.$broadcast("hi")}
    this.listen = function(callback) {$rootScope.$on("hi",callback)}
})

4
Спасибі @itcouldevenbeabout Чи не ця лінія називає ту саму логіку приєднання події до глобального $ rootScope? function () {$ rootScope. $ Broadcast ("привіт")}, про яку ви згадали, є поганою практикою?
Nexus23

11
Використання послуги для створення трансляцій, а також приєднання слухачів до конкретної події дозволяє уникнути ситуації, коли ви не впевнені, хто слухає. Стає зрозуміло, від яких компонентів залежність має служба подій
CoolTapes

4
Щойно відкривши різницю між $ emit та $ трансляцією, я схиляюся сказати, що було б краще $ emmit подія - таким чином ви подія забруднюєте в найменшому наборі областей, (в ідеалі послуга мала б це власний розмах, але я не думаю, що це можливо?)
Брондаль

3
-1. Я не бачу, як ізоляція в сервісі краща, ніж просто мовлення. У будь-якому випадку, краще використовувати власну приватну сферу в сервісі. І краще використовувати $ emit, а не $ мовлення. Також пропонована послуга не підтримує аргументи події. Що ще гірше, він не підтримує підписку; смертельний гріх за $ rootScope.
альфа-миша

3
Відсутність передплати руйнує цю відповідь для мене. Якщо ви телефонуєте hiEventService.listen(callback)з контролера, слухач все одно буде існувати навіть після того, як контролер буде знищений. Витік пам'яті! Прив’язка до області контролера $scope.$on("hi",callback)відбувається з автоматичним очищенням.
adamdport

32

$ rootScope. $ трансляція - це зручний спосіб підняти "глобальну" подію, яку можуть прослухати всі області дитини. Потрібно використовувати лише $rootScopeдля трансляції повідомлення, оскільки всі його нащадки можуть слухати його.

Коренева область передає подію:

$rootScope.$broadcast("myEvent");

Будь-яка дитина може прислухатися до події:

$scope.$on("myEvent",function () {console.log('my event occurred');} );

Чому ми використовуємо $ rootScope. $ Broadcast? Ви можете використовувати $watchдля прослуховування змін змінних та виконання функцій, коли змінюється стан змінної. Однак у деяких випадках ви просто хочете викликати подію, яку можуть слухати інші частини програми, незалежно від будь-яких змін стану змінної області. Це коли $broadcastкорисно.


19

Передача даних !!!

Цікаво, чому ніхто не згадує, що $broadcastприймає параметр, де можна передати Objectотримане, $onвикористовуючи функцію зворотного виклику

Приклад:

// the object to transfert
var myObject = {
    status : 10
}

$rootScope.$broadcast('status_updated', myObject);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})

8

Що робить $ rootScope. $ Мовлення?

Він передає повідомлення відповідним слухачам у всьому кутовому додатку, це дуже потужний засіб для передачі повідомлень у сфери застосування на різному ієрархічному рівні (будь то батько, дитина чи брати і сестри)

Аналогічно, у нас є $ rootScope. $ Emit, єдиною різницею є те, що перший також потрапляє в область $.

зверніться за прикладами: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.