2015-05-30 2 views
3

У меня возникла ситуация, когда я хотел бы $broadcast из функции связывания директивы, где эта директива имеет изолированную область видимости. К сожалению, так как директива scope не образцово, унаследованные от родительского $scope вещания внутри изолированного объема невозможно, - reference.Невозможно транслировать из изолированной области в директивно-негативные последствия установки области действия в false?

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

Так что, может быть, я могу быть осторожным в том, чтобы заполнить родительскую область. Существуют ли другие причины, по которым я, возможно, не хочу использовать scope: false в директиве, предназначенной для повторного использования? - Это просто предпочтения и «аккуратность» или существуют ли другие негативные последствия?

Насколько я знаю, нет альтернативы для получения функциональности, которая достигается при трансляции изнутри функции связывания директивы, отличной от того, может быть, изменение директивы изменяет сервис (что невозможно в моей ситуации из-за родительская иерархия) - насколько я могу судить, использование $broadcast - единственный способ. Любое направление приветствуется.

Спасибо!

EDIT: Чтобы было ясно, мое намерение состоит в том, чтобы транслировать внутри изолированного объема, вниз детям родительской области, то есть

JS

.controller('parent', function ($scope) { 
    $scope.parent = 'parentProperty'; 
}) 
.directive('isolate', function() { 
    return { 
    scope: {}, 
    template: '<div ng-click="click()">Click</div>', 
    link: function (scope) { 
     scope.click = function() { 
     console.log('clicked,but no broadcast'); 
     scope.$broadcast('event', 'string'); 
     } 
    } 
    }; 
}) 
.directive('child', function() { 
    return { 
    link: function(scope) { 
    scope.$on('event', function (e, event) { 
     console.log(event); 
    }); 
    } 
}; 
}); 

HTML

<body ng-controller="parent"> 
    <div isolate>Click me to broadcast 
     </div> 
     <div child> 
     </div> 
    </body> 

PLNKR : http://plnkr.co/edit/wKDOP4UpdgDFrHvzY0UN?p=preview

ответ

4

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

Как вы можете видеть, область изоляции смогла прослушивать события, транслируемые вниз по иерархии областей; однако он не смог увидеть значение соответствующей области «pingCount» в своей родительской области.

Хитрость заключается в том, чтобы помнить, что в AngularJS $broadcast посылает события вниз иерархии областей видимости родителя/ребенка (в том числе изолят областей) .Вы можете использовать $emit для отправки событий до иерархии.

Похоже, вы хотите использовать $emit внутри функции ссылки вашей директивы, таким образом, событие перейдет к родительским областям. Explanation из документов.

EDIT

Хорошо, вот простой подход с использованием двух событий. В директиве сначала используется $emit() для отправки события в родительскую область. В родительском поле используется $on(), чтобы дождаться этого события.Когда это происходит, он использует $broadcast() для отправки другого события всем дочерним областям.

Plunkr

Это примитивно и, скорее всего, пробой. Вместо этого вы можете взглянуть на использование свойств директив require и иметь контроллер с API, который дочерние директивы используют для связи.

+1

Я хочу сказать, что если вы хотите, чтобы родительская область «слышала» событие, вам нужно использовать '$ emit()', а не '$ broadcast()'. –

+0

Gotcha. Таким образом, область выделения действует как дочерний элемент в родительскую область, и поэтому она может только '' 'emit''' вверх? - То есть, он никогда не сможет «' $ передавать »до детей родительской области? В этом случае область должна быть установлена ​​в '' 'false''' - если вы хотите' '' $ broadcast'''. –

+0

'$ broadcast' и' $ emit' делают то же самое: они отправляют ваше событие. По соображениям производительности (?) Вы отправляете события UP в родительские области (с использованием $ emit) или DOWN в дочерние области (используя $ broadcast). Поскольку вы хотите отправить что-то из области изоляции в родительскую область, вам нужно использовать $ emit. –

Смежные вопросы