2015-07-04 1 views
0

Итак, на странице у меня есть 3 угловых пользовательских директивы AA BB и CC. Иногда BB внутри AAКак определить, что директива B находится внутри директивы A

<AA> 
    <BB></BB> 
</AA> 

другой раз BB внутри CC

<CC> 
    <BB></BB> 
</CC> 

Думай об этом, как
1) Я отображаются BB внутри предварительного просмотра
2) I» m отображает BB на какой-то приборной панели
Я бы хотел обнаружить внутри контроллера BB, если BB находится внутри директивы AA или CC. Я могу проверить путь в URL ($ location) - но, может быть, есть другой способ?

+1

Можете ли вы объяснить, почему вы должны знать это? Как это влияет на то, что вы пытаетесь достичь? Если вы пытаетесь получить доступ к родительской директиве, вы можете использовать require с массивом, где вы должны установить как AA, так и CC в качестве необязательного. Я просто пытаюсь понять, как наилучшим образом дать вам ответ. – jme11

ответ

0

Хорошо, чтобы расширить мой комментарий, если вы используете require в вашей директиве вы можете передать в массиве имен директив, и если они установлены на необязательный, он не выдаст ошибку, если требуемая директива не найдена. Вместо этого он просто вернется в массив контроллеров undefined. Установка необходимых контроллеров в качестве опциональных осуществляется путем указания имени директивы с помощью ?. Каретка ^ сообщает, чтобы найти требуемый контроллер, выполнив поиск элемента и его родителей. Начиная с версии 1.3, вы можете даже использовать ^^, чтобы попытаться найти требуемый контроллер, только посетив родительские элементы (так что с этим вы не можете иметь обе директивы для одного и того же элемента).

Таким образом, вы можете сделать это:

app.directive('BB', function() { 
return { 
    require: ['?^AA','?CC'], 
    link: function(scope, element, attrs, controllers) { 
    parent = controllers[0] ? 'AA' : 'CC'; 
    alert(parent); 
    } 
} 
+0

Привет, я думаю, что дополнительное требование может работать для меня. – szydan

0

Если у вас есть свои собственные директивы, вы можете прикрепить свойство к области. Из дочерней директивы, и если она не изолирует область видимости, вы можете пересечь цепочку областей и определить, существует ли это свойство.

Альтернативно, вы проходите DOM вверх до элемента кузова и проверяете элемент директивы.

Примеры вскоре последуют ...

0

Используйте require ключ в возвращаемом значении вашей декларации директивы.

require: '^myTabs', 

Вот пример с сайта AngularJS:

app.directive('myPane', function() { 
return { 
    require: '^myTabs' 
} 

http://plnkr.co/edit/KR9bgWesS8pl8Qq06aJq?p=preview

Существует также статья объяснения об этой директиве связи.

https://thinkster.io/a-better-way-to-learn-angularjs/directive-to-directive-communication

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