Является ли scope.$parent.$emit() хорошей практикой для отправки события ТОЛЬКО в родительскую область?

Почему я использую scope.$parent().$emit(), кроме scope.$emit(), это когда директива использует scope:true, а есть еще одна директива, использующая scope:true, и они помещаются в один и тот же узел DOM.

Затем scope.$emit() также отправит событие в другую директиву и может быть перехвачено так же, как и родительская область. Но scope.$parent().$emit() будет передавать событие только родителю. Хорошо ли использовать scope.$parent().$emit()?

Кажется, не имеет значения, могут ли другие директивы перехватывать событие или нет, но я не уверен в этом. Так что, возможно, ТОЛЬКО испускание в родительский элемент может быть хорошим в некоторых случаях.
Вот пример: загрузить

Событие "вторая директива" может быть перехвачено только MainCtrl. но «вторая-директива-два» может быть перехвачена с помощью MainCtrl и первой директивы.


person tjfdfs    schedule 12.11.2013    source источник


Ответы (2)


Вот связанный с этим вопрос: Как остановить события $broadcast в AngularJS?

Вы можете использовать

$rootScope.$broadcast('second-directive-two', 'from second');

вместо

$scope.$parent().$emit('second-directive-two', 'from second');

и отменить обработку событий в контроллере

$scope.$on('second-directive-two',function(event,args){
    event.preventDefault();
});

И не обрабатывать событие «вторая-директива-два» в директиве first, если событие было предотвращено.

$scope.$on('second-directive-two',function(event,args){
    if (!event.defaultPrevented) {
        // do useful job
    }
});

Вот выброс

Обновление:

Почему это не является хорошей практикой?

В этом случае вы привязаны к структуре иерархии DOM. Представьте, что вам нужно перевести директиву First в частичную и включить ее через ng-include. Иерархия области была изменена. $scope.$parent().$emit() с этого момента не работает. И вы потратили время, чтобы решить эту проблему.

Как правило, $scope.$parent().$emit() генерирует потенциально проблемный код

person Anton Rodin    schedule 12.11.2013
comment
это кажется хорошим. Но я буду признателен, если вы объясните, почему использовать $scope.$parent().$emit() нехорошо. Спасибо:) - person tjfdfs; 13.11.2013

Похоже, вы могли бы использовать scope.$broadcast() вместо emit. Это похоже на emit, но данные в цепочке области видимости циркулируют наоборот.

person TheHippo    schedule 12.11.2013
comment
Передается ли $broadcast только в нисходящем направлении только в дочернюю область? Как дочерняя область может использовать трансляцию для трансляции события в родительскую область? - person tjfdfs; 12.11.2013
comment
Я проверяю это. И использование scope.$broadcast() можно поймать только по директиве. - person tjfdfs; 12.11.2013