Я столкнулся с ситуацией, которая кажется противоположной любому аналогичному вопросу здесь, на StackOverflow.Доступ к изолированной родительской области из переопределенной директивы
У меня есть директива <scroll>
, которая просто обертывает любой контент, который он имеет, с прокручиваемым div
. Это выглядит примерно так:
.directive('scroll', ['$document','$parse', function ($document,$parse) {
return {
restrict: 'E',
replace: true,
transclude: true,
scope:false,
template:
'<div class="scroll">' +
'<div class="content" data-ng-transclude>' +
'</div>' +
'</div>',
link: function (scope, element, attr) {
// some code here....
}
};
}]);
Это прекрасно работает само по себе.
Теперь у меня есть еще директиву под названием <editor>
, который имеет изолированный объем и использует <scroll>
в это шаблон. <editor>
выглядит более или менее, как:
.directive('editor', ['$document', function ($document){
return {
restrict: 'EA',
replace: true,
transclude: false,
scope:true,
template:
'<div>' +
'....<scroll>....</scroll>....' +
'</div>',
link: function (scope, element, attrs) {
.....
}
};
}]);
Теперь, вот в чем дело: мне нужно, чтобы получить доступ к области видимости s внутри <scroll>
'<editor>
функции связи с (где он говорит, что „какой-то код здесь“), но по какой-то причине Я не могу. Переменная scope
в функции ссылки <scroll>
в значительной степени пуста, и scope.$parent
дает мне контроллер выше, пропуская <editor>
, который должен быть в пути.
Я пытался играть с ng-transclude
в разных местах в <editor>
и попытался с помощью $emit
, и я действительно невежествен об этом - я думаю, что изоляция сферы будет изолировать «меня и все, что ниже меня» от того, что выше, но кажется, что изоляция области просто берет «я» из дерева области ...
Надеюсь, что это достаточно ясно, спасибо.
Посмотрите [видео Джона Линдквист в] (http://www.egghead.io/video/ 2CdivtU5ytY) об общении между директивами. Это может заставить вас идти в правильном направлении. –
Вы должны стараться не делать этого таким образом, потому что теперь вы ограничиваете свою директиву прокрутки жестко закодированной в директиве вашего редактора. Это классический случай «связи» и ограничивает повторное использование ваших директив. При этом есть много способов сделать это. Лучше всего, вероятно, использовать $ emit или $ broadcast для отправки событий. Если вы сделаете это правильно, вы можете оставаться «развязанным» и по-прежнему использовать свой прокрутки в другом месте. –
Это просто поразило меня, почему это происходит, хотя у меня пока нет решения: дело в том, что метод «link» внутренней директивы срабатывает перед родительским, поэтому я вижу, что я не могу получить доступ к области родителя от в функции 'link', но может быть разметкой с' {{}} '. Возможно, решение состоит в том, чтобы иметь внутреннюю директиву '$ watch' для того, чтобы верхняя директива была готова, прежде чем использовать' $ parse (...) (scope) ', чтобы добраться до нее. – motig88