Я хотел бы сделать директиву, которая имеет изолированный охват. Внутри этой директивы есть некоторые другие директивы, и они должны иметь тот же объем, что и родительский.
<parent> <!-- Isolated scope -->
<child> </child> <!-- Belongs to the container isolated scope -->
</parent>
Я не могу этого сделать.
редактировать
этот Plunker показывает, как дети сохраняют ту же область, что и ее родительская, если родительский объект является дочерней областью. Я забыл, что когда вы не используете шаблон /templateUrl, данные внутри элемента не будут выбрасываться.
Кажется, что размер дочерних объектов не может быть таким же, как и у родительской области, если выделена область родительского объекта. Требование необходимо для добавления данных в родительскую область.
Пробовали ли вы использовать свойство require
на свой объект определения дочернего элемента? Вам нужно будет определить контроллер на вашем родителе, а с require
установленным к ^container
в дочерней директиве, вы будете иметь доступ к родительскому контроллеру в своей функции link
в качестве четвертого аргумента:
angular.module('app', [])
.directive('container', function(){
return {
restrict : 'E',
transclude : true,
scope : {
},
template : 'container <ng-transclude> </ng-transclude>',
controller: function($scope){
// use this to add properties to the controller itself
// which you can then access in the child directive
this.container = "container";
},
link : function($scope){
}
};
})
.directive('child', function(){
return {
require: '^container',
restrict : 'E',
template : 'child container',
link : function($scope, element, attrs, containerController){
$scope.child = "child";
// logs: containerController Object {container: "container"}
console.log('containerController', containerController);
}
};
});
ng-transclude
, разве нет способа сделать родительскую область такой же, как и дочернюю, когда родитель имеет изолированную область? Я создал обновленный элемент, в котором родительские и дочерние элементы имеют одну и ту же область. Но я могу сделать это только тогда, когда у них нет изолированной области.
Это из-за ngTransclude. В документах (https://docs.angularjs.org/guide/directive) указано:
Параметр transclude изменяет способ вложенности областей. Это делает так, чтобы содержимое трансключенной директивы имело любую область действия вне директивы, а не любую область видимости внутри. При этом он предоставляет доступ к содержимому для внешнего охвата.