Ответ 1
Сначала добавьте restrict:'E'
к внутреннему контроллеру, чтобы сделать его доступным как элемент.
Затем измените require : 'outer'
на require : '^outer',
, чтобы включить поиск этой директивы в родителях.
Затем вам нужно использовать transclude, чтобы включить просмотр содержимого <outer>
, выполнив следующие шаги:
- добавить
transclude = true
во внешнюю директиву. - определить, где вы хотите, чтобы внутренние данные просматривались. (Я думаю, вам нужно, чтобы он появился после строки "Я внешняя", поэтому вы можете изменить шаблон внешнего, чтобы он выглядел как
template:'<div><h1>i am a outer</h1><div ng-transclude></div></div>'
).
Тогда вам вообще не нужен параметр компиляции. Поскольку эта переменная, которая называется externalcontrol, не будет вызываться во внешней директиве, но во внутренней директиве, поэтому нет никакой необходимости компиляции для внешней директивы, и внутренняя функция ссылки будет изменена так:
link: function(scope, elem, attr, outercontrol){
outercontrol.addItem(1);
}
после этой модификации окончательный код будет выглядеть следующим образом:
HTML:
<outer>
<inner></inner>
</outer>
js:
var app = angular.module("exampleApp",[]);
app.directive('outer', function(){
return{
transclude:true,
restrict:'E',
template:'<div><h1>i am a outer</h1><div ng-transclude></div></div>',
controller : function($scope){
this.addItem = function(val){
console.log(val);
}
}
}
});
app.directive('inner',function(){
return{
restrict:'E',
require : '^outer',
template : '<div><h1>i am a inner</h1></div>',
link:function(scope,elem,attr,outercontrol){
outercontrol.addItem(1);
}
}
});