AngularJS rootScope. $ Emit из директивы

У меня есть указание пользователям ставить лайки (или «добавлять в избранное») в моем приложении. Во всех своих контроллерах я использую $ rootScope. $ Emit ('name-of-function', some-id) для обновления пользовательских данных, когда им нравится новый пост, поскольку это отражено во всем моем приложении. Но я не могу использовать $ rootScope. $ Emit в директиве. Я получаю ошибку

$ rootScope. $ emit не является функцией

Предположительно событие $ rootScope. $ On, которое соответствует этой команде, еще не было вызвано, поэтому эта функция еще не существует? Что с этим можно сделать? Есть ли способ лучше устроить это?

var module = angular.module('directives.module');

module.directive('postFave', function (contentService, $rootScope) {
return {
    restrict: 'E',
    templateUrl: 'directives/post-fave.html',
    scope: {
        contentId: '@',
        slug: '@'
    },
    link: function ($scope, $rootScope, element) {

        $scope.contentFavToggle = function (ev) {
            contentId = $scope.contentId;
            contentService.contentFavToggle(contentId, ev).then(function (response) {
                $rootScope.$emit('dataUpdated', $scope.slug);
                if (response) {
                    $scope.favourite[contentId] = response;
                } else {
                    $scope.favourite[contentId] = null;
                }
            });
        };

        console.log("track fave directive called");
    }
};
});

с контроллера:

var dataUpdatedListener = $rootScope.$on('dataUpdated', function (event, slug) {
    dataService.clearData(slug);
    dataControllerInit();
});

Как я могу получить доступ к этой функции rootcope из директивы? Спасибо.

FYI - в директиве использовалась «ссылка», потому что она связана с экземпляром элемента HTML, который будет использоваться на странице несколько раз.




Ответы (1)


link имеет следующую сигнатуру, нет необходимости добавлять $rootScope инъекцию в link функцию:

function link(scope, element, attrs, controller, transcludeFn) { ... }

Удалите его из link и все заработает.

person Bill P    schedule 02.12.2019
comment
Ах так просто! Мне нравятся эти исправления :) - person Leon; 02.12.2019