Пытался найти основную информацию по AngularJS $rootScope.$broadcast
, но документация по AngularJS мало помогает. Простыми словами, почему мы это используем?
Кроме того, внутри шаблона Hot Towel Джона Папы есть пользовательская функция в общем модуле с именем $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
.Ответы:
Что
$rootScope.$broadcast
делать?$rootScope.$broadcast
отправляет событие через область приложения. Любые дети объем этого приложения может поймать его с помощью простого:$scope.$on()
.Особенно полезно отправлять события, когда вы хотите достичь области, которая не является прямым родителем (например, ветвь родителя)
!!! Одна вещь , чтобы не делать , однако, использовать
$rootScope.$on
от контроллера.$rootScope
это приложение, когда ваш контроллер будет уничтожен, этот прослушиватель событий все еще будет существовать, а когда ваш контроллер будет создан снова, он просто накапливает больше прослушивателей событий. (Таким образом, одна трансляция будет поймана несколько раз). Используйте$scope.$on()
вместо этого, и слушатели также будут уничтожены.В чем разница между
$rootScope.$broadcast
&$rootScope.$broadcast.apply
?Иногда приходится пользоваться
apply()
, особенно при работе с директивами и другими библиотеками JS. Однако, поскольку я не знаю этой кодовой базы, я не мог бы сказать, так ли это здесь.источник
$rootScope.$on
утечке памяти. Это относится и к принятому ответу, так как контроллеры, скорее всего, вызовутhiEventService
созданный им.$broadcast
vs.$broadcast.apply()
$rootScope
в основном функционирует как слушатель и диспетчер событий.Чтобы ответить на вопрос о том, как он используется, он используется вместе с
rootScope.$on
;Однако использование в
$rootScope
качестве общей службы событий вашего собственного приложения - плохая практика , поскольку вы быстро попадете в ситуацию, когда каждое приложение зависит от $ rootScope, и вы не знаете, какие компоненты какие события прослушивают.Лучше всего создавать службу для каждого настраиваемого события, которое вы хотите прослушивать или транслировать.
источник
hiEventService.listen(callback)
из контроллера, слушатель все еще будет существовать даже после уничтожения контроллера. Утечка памяти! Привязка к области контроллера$scope.$on("hi",callback)
идет с автоматической очисткой.$ rootScope. $ broadcast - удобный способ вызвать «глобальное» событие, которое могут прослушивать все дочерние области. Вам нужно использовать только
$rootScope
для широковещательной рассылки сообщения, так как все дочерние области могут его прослушивать.Корневая область видимости транслирует событие:
Любой дочерний Scope может прослушивать событие:
Почему мы используем $ rootScope. $ Broadcast? Вы можете использовать
$watch
для прослушивания изменений переменных и выполнения функций при изменении состояния переменной. Однако в некоторых случаях вы просто хотите вызвать событие, которое могут прослушивать другие части приложения, независимо от любого изменения состояния переменной области. Это когда$broadcast
полезно.источник
Передача данных !!!
Интересно, почему никто не упоминает, что
$broadcast
принимает параметр, в котором вы можете передать,Object
который будет получен с$on
помощью функции обратного вызоваПример:
источник
Что делает $ rootScope. $ Broadcast?
Он транслирует сообщение соответствующим слушателям по всему приложению angular, что является очень мощным средством для передачи сообщений в области на другом иерархическом уровне (будь то родительский, дочерний или братья и сестры)
Точно так же у нас есть $ rootScope. $ Emit, с той лишь разницей, что первый также попадает в $ scope. $ On, а второй - только в $ rootScope. $ On.
см. примеры: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
источник