Angularjs Pubsub против $ вещания

Я читал о передаче событий в Angularjs и не уверен, что использование $ broadcast - хорошая идея.

Блоги, подобные этому, выступают за то, чтобы привыкнуть к доллару, даже если это "похоже на излишество".

Я путаюсь с тем, что реализация использует первичный обход областей и ищет подписчиков, что делает скорость ваших событий зависимой от вашей древовидной структуры. Вот код из этого в угловых:

// Insanity Warning: scope depth-first traversal
// yes, this code is a bit crazy, but it works and we have tests to prove it!
// this piece should be kept in sync with the traversal in $digest
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
   while(current !== target && !(next = current.$$nextSibling)) {
     current = current.$parent;
   }
}

Кроме того, кажется, что вы сможете взломать внедрение зависимостей, используя эти методы.

Альтернативой является просто служба, которая кэширует типы событий и обратные вызовы и вызывает их напрямую. Для этого необходимо очистить подписки, чтобы избежать утечек.

У меня вопрос, есть ли что-то, чего мне не хватает в мотивации парадигмы $broadcast/$ на? Или есть ли смысл использовать его по сравнению с более традиционным пабом?

Дайте мне знать, если я не достаточно ясно с моим вопросом, и спасибо за ваше время.

2 ответа

Решение

Я не думаю, что вы что-то упускаете. Вы успешно изложили плюсы / минусы каждого подхода.

$broadcast/$on Подход не требует от вас отмены подписки, но он не очень эффективен, так как транслируется на все сферы действия. Он также имеет очень низкий барьер для входа. Вам не нужно вводить какие-либо услуги, вам не нужно создавать их. Они вещают всем, так что это более простой подход.

Подход паб / суб гораздо более прямой. События получают только подписчики, так что не все системы будут работать. Однако это более сложно, потому что вам нужно написать свой сервис с обработчиками обратного вызова, и вы должны помнить, чтобы отказаться от подписки. Запоминание отписаться довольно большое, на мой взгляд. Если вы не поняли это правильно, вы получите утечки памяти. И вы не узнаете об этом, пока это не станет проблемой через 3 месяца.

Я понимаю, почему встроенный подход $broadcast,

Я смотрел на эту же проблему. В частности, как разрешить сервисам транслировать и подписываться на события без доступа к $rootScope (плохо по нескольким причинам). Я использовал отличную реализацию js-сигналов здесь: http://millermedeiros.github.io/js-signals/ и обернул ее в угловой сервис.

Github Gist здесь: https://gist.github.com/anonymous/b552c7fafa77427e6d06

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