Директива $ rootScope. $ Об остаточной проблеме прослушивателя событий - PullRequest
1 голос
/ 25 апреля 2019

У меня есть директива, которая содержит в своем контроллере такой наблюдатель, как:

$rootScope.$on('broad1', (event, args) => {
            doSomething()
});

Затем я перезагружаю (с помощью $ state.go) часть моей страницы, которая содержит мою директиву. И, к сожалению, даже если моя директива повторяется и, конечно же, не дублируется, новый наблюдатель создается и добавляется в мою корневую область. (Я уже знаю, что когда наблюдатель подключен к корневому диапазону, он не уничтожается, а директива удаляется из DOM)

Итак, когда я транслирую 'broad1', наблюдатели выполняются n раз (что соответствует n предыдущим перезагрузкам). ПОЧЕМУ?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

При использовании шины событий AngularJS в директивах события слушатели должны быть помещены в локальную область действия .События должны транслироваться из $rootScope:

app.directive("myDirective", function() {
    return {
        link: postLink,
    };
    function postLink(scope,elem,attrs) {
        scope.$on('broad1', (event, args) => {
            doSomething()
        });
        scope.broadcast = function(data) {
            scope.$root.$broadcast("broad1", data);
        };
    };
})

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

Для получения дополнительной информации см.


Обновление

Имейте в виду, что шина событий AngularJS неэффективна и устарела.По возможности используйте более прямые способы передачи событий своим получателям.

Из документов:

Используйте только. $ Broadcast () и. $ On () для атомарных событий

События, которые актуальны во всем приложении (например, аутентификация пользователя или закрытие приложения).Если вы хотите, чтобы события относились к модулям, службам или виджетам, вам следует рассмотреть службы, директивные контроллеры или сторонние библиотеки

  • Инъекция служб и методы вызова напрямую также полезны для прямой связи
  • Директивы могут напрямую связываться друг с другом через директивы-контроллеры

- AngularJS Wiki - Best Practices

См. Также,

0 голосов
/ 26 апреля 2019

спасибо за вашу реактивность и понимание, я исправил это с помощью $ scope.on [...] и $ rootscope.broadcast [...].С другой стороны, «сервисный путь» тоже был удачным.

Хорошего дня.

...