Контроллер доступа из директивы внутри директивы с изолированной областью действия

Я только начинаю работать с angularJS, и у меня возникла небольшая проблема, связанная с определением области действия с помощью директив и контроллеров.

В примере, на который я ссылаюсь ниже, у меня есть набор из двух директив; одна директива атрибута (showMessage) и одна директива элемента (parentDirective).

http://jsfiddle.net/ejSxM/1/

Я хотел бы использовать showMessage как поведение, чтобы при щелчке элемента он запускал функцию в контроллере. Это прекрасно работает с обычными html-элементами, но когда я применяю его к своему parentDirective, showMessage берет область действия parentDirective, а не контроллера.

Это можно продемонстрировать на прилагаемом примере. При нажатии на «Я сам по себе» директива имеет область действия контроллера, поэтому функция showMessage в области действия контроллера вызывает нормально. Однако при нажатии на «Я директива» директива теперь имеет область действия родительской директивы и помечает ошибку.

Есть ли способ получить доступ к области контроллера из вложенной директивы, даже если родительская директива имеет изолированную область?


person Sam    schedule 21.02.2013    source источник


Ответы (2)


Вы можете передать выражения в свою директиву следующим образом: <my-directive onsomeevent="functionInMyController()"></my-directive>

И затем в вашей директиве:

...
scope: {
    onevent: '&onsomeevent'
},
link: function() {
    element.bind('click',function () {
       scope.onevent(); 
    });
}
...

То есть вы привязываете выражение из аргумента onsomeevent, чтобы вы могли выполнить его внутри своей директивы, не зная, что это за выражение. Выражение выполняется в родительской области, поэтому functionInMyController необходимо определить в родительской области. Вы также можете передать переменные из вашей функции связывания в это выражение, пример которого вы можете найти здесь (в разделе области видимости) директивы.

person Anders Ekdahl    schedule 21.02.2013
comment
Спасибо за вашу помощь. Этот другой подход идеально соответствует моим потребностям, и я могу избавиться от ненужных теперь директив поведения. Если кому-то интересно, вот еще один jsfiddle, использующий описанный выше подход: jsfiddle.net/HDEF7/3 - person Sam; 21.02.2013

Вы можете установить контроллер для директивы.

controller - Controller constructor function. The controller is instantiated 
before the pre-linking phase and it is shared with other directives if they 
request it by name (see require attribute).
This allows the directives to communicate with each other and augment each other's 
behavior. The controller is injectable with the following locals:
$scope - Current scope associated with the element
$element - Current element
$attrs - Current attributes obeject for the element
$transclude - A transclude linking function pre-bound to the correct transclusion
scope:     
function(cloneLinkingFn).

http://docs.angularjs.org/guide/directive

person bbs    schedule 21.02.2013