Я зарегистрировал своего слушателя на событие трансляции $, используя функцию $ on
$scope.$on("onViewUpdated", this.callMe);
и я хочу отменить регистрацию этого слушателя на основе определенного бизнес-правила. Но моя проблема в том, что после регистрации я не могу отменить ее регистрацию.
Есть ли в AngularJS какой-либо метод для отмены регистрации конкретного слушателя? Такой метод, как $ для отмены регистрации этого события, может быть $ off. Так что на основе бизнес-логики я могу сказать
$scope.$off("onViewUpdated", this.callMe);
и эта функция перестает вызываться, когда кто-то передает событие «onViewUpdated».
Спасибо
РЕДАКТИРОВАТЬ : Я хочу отменить регистрацию слушателя от другой функции. Не та функция, где я это регистрирую.
Ответы:
Вам необходимо сохранить возвращенную функцию и вызвать ее, чтобы отписаться от события.
Это найдено в исходном коде :) по крайней мере в 1.0.4. Я просто выложу полный код, так как он короткий
Также смотрите документы .
источник
Глядя на большинство ответов, они кажутся слишком сложными. Angular имеет встроенные механизмы для отмены регистрации.
Используйте функцию отмены регистрации, возвращенную
$on
:источник
$scope.$on
что не нужно регистрироваться вручную$destroy
. Лучшим примером будет использование$rootScope.$on
.Этот код работает для меня:
источник
РЕДАКТИРОВАТЬ: правильный способ сделать это в ответе @ LiviuT!
Вы всегда можете расширить область действия Angular, чтобы удалить таких слушателей, например:
И вот как это будет работать:
И вот плункер этого в действии
источник
После отладки кода я создал свою собственную функцию, аналогичную ответу "blesh". Так вот что я сделал
поэтому, добавив мою функцию к $ rootcope, теперь она доступна для всех моих контроллеров.
и в моем коде я делаю
Спасибо
РЕДАКТИРОВАТЬ: AngularJS способ сделать это в ответе @ LiviuT! Но если вы хотите отменить регистрацию слушателя в другой области и в то же время хотите избежать создания локальных переменных, чтобы сохранить ссылки на функцию отмены регистрации. Это возможное решение.
источник
Ответ @ LiviuT потрясающий, но, похоже, многие люди задаются вопросом, как повторно получить доступ к функции разрыва обработчика из другой области действия или функции $, если вы хотите уничтожить ее из места, отличного от того, где оно было создано. Ответ @ Рустем Мусабеков работает просто замечательно, но не очень идиоматично. (И полагается на то, что должно быть частной реализацией, которая может измениться в любое время.) И с этого момента, это становится все более сложным ...
Я думаю, что простой ответ здесь - просто передать ссылку на функцию разрыва (
offCallMeFn
в его примере) в самом обработчике, а затем вызвать ее на основании некоторого условия; возможно, аргумент, который вы включаете в событие, которое вы $ широковещательно или $ излучаете. Таким образом, обработчики могут сносить себя, когда вы хотите, где угодно, неся семена своего собственного уничтожения. Вот так:Две мысли:
selfDestruct
как только он завершит свою миссию самоубийства.источник
Зарегистрируйте ловушку, чтобы отписаться от ваших слушателей, когда компонент удален:
источник
В случае, если вам нужно включить и выключить слушатель несколько раз, вы можете создать функцию с
boolean
параметромисточник
«$ on» само по себе возвращает функцию для отмены регистрации
Вы можете вызвать функцию unregister (), чтобы отменить регистрацию слушателя.
источник
Один из способов - просто уничтожить слушателя, как только вы закончите с ним.
источник