Почему мы используем трансляцию $rootScope.$ В AngularJS?

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

Кроме того, в шаблоне Hot Towel Джона Папы в общем модуле есть пользовательская функция с именем $broadcast:

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

Я не понял, что это делает. Итак, вот пара основных вопросов:

1) Что $rootScope.$broadcast делать?

2) В чем разница между $rootScope.$broadcast а также $rootScope.$broadcast.apply?

5 ответов

Решение
  1. Что значит $rootScope.$broadcast делать?

    $rootScope.$broadcast отправляет событие через область приложения. Любая дочерняя область этого приложения может поймать его с помощью простого: $scope.$on(),

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

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

  2. В чем разница между $rootScope.$broadcast & $rootScope.$broadcast.apply?

    Иногда вы должны использовать apply() особенно при работе с директивами и другими библиотеками JS. Однако, поскольку я не знаю эту кодовую базу, я не смогу сказать, так ли это здесь.

$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)}
})

$rootScope.$broadcast - это удобный способ вызвать "глобальное" событие, которое могут прослушивать все дочерние области. Вам нужно только использовать $rootScope передать сообщение, так как все области потомка могут его прослушать.

Корневая область транслирует событие:

$rootScope.$broadcast("myEvent");

Любой ребенок Scope может прослушать событие:

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

Почему мы используем $ rootScope. $ Broadcast? Ты можешь использовать $watch прослушивать изменения переменных и выполнять функции при изменении состояния переменных. Однако в некоторых случаях вы просто хотите вызвать событие, которое могут прослушивать другие части приложения, независимо от каких-либо изменений в состоянии переменной области. Это когда $broadcast полезно

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

Интересно, почему никто не упомянул, что $broadcast принять параметр, где вы можете передать Object что будет получено $on используя функцию обратного вызова

Пример:

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

$rootScope.$broadcast('status_updated', myObject);

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

Что делает $rootScope.$ Broadcast?

Он передает сообщение соответствующим слушателям по всему угловому приложению, очень мощное средство для передачи сообщений в области на другом иерархическом уровне (будь то родитель, потомок или братья и сестры)

Аналогично, у нас есть $rootScope.$ Emit, единственное отличие состоит в том, что первое также перехватывается $ scope. $ On, а второе - только $rootScope.$ On.

см. примеры: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

Другие вопросы по тегам