Если мы не укажем ни scope:true
(новый масштаб), ни scope:{}
(isolatedScope), а когда мы повторно используем директиву, свойства, определенные в области видимости, будут переопределены.
Для Ex:
<div ng-controller="AppCtrl">
<my-control name="myControl1">
Some Content: {{value}}
My Control Name: {{name}}
</my-control>
<my-control name="myControl2">
Some Content: {{value}}
My Control Name: {{name}}
</my-control>
</div>
Вместо печати как myControl1
и myControl2
на экране, он будет печатать myControl2
два раза.
Plnkr
Чтобы преодолеть этот вопрос попробовать любой из приведенных ниже решений.
Solution1
transclde:true
создаст новую область. установите свойства в этой области действия вместо области действия директивы.
app.directive('myControl', function() {
return {
restrict: 'E',
transclude: true,
template: '<div><p><strong>Welcome to the testMe directive!</strong></p> <div ng-transclude></div></div>',
link: function(scope, element, attrs) {
var transclusionTarget = element[0].querySelector('[ng-transclude]').firstChild;
var transclusionScope = angular.element(transclusionTarget).scope();
transclusionScope.name = attrs.name;
}
}
});
здесь элемент под ng-transclude
DIV будет скомпилирован с transclusionScope, захватить его и обновить свойства в нем.
Plnkr
Solution2 Вместо использования ng-transclude
вручную transclude содержание.
app.directive('myControl', function() {
return {
restrict: 'E',
transclude: true,
template: '<div><p><strong>Welcome to the testMe directive!</strong></p> <div transclude-target></div></div>',
link: function(scope, element, attrs, directiveCtrl, transcludeFn) {
var transclusionScope = scope.$new(),
transclusionTarget = element[0].querySelector('[transclude-target]');
transclusionScope.name = attrs.name;
transcludeFn(transclusionScope, function (clone) {
angular.element(transclusionTarget).append(clone);
});
}
}
});
Здесь, создать new Scope
расширения сферы дИРЕКТИВЫ, используя scope.$new()
. И обновите свойства в нем.
Plnkr
Solution1 не может работать во всех случаях. К тому моменту, когда мы получаем доступ к firstChild
, и если он не готов Решение1 не получится.
Решение2 является более чистым и будет работать во всех случаях.
Привет Павел! Будет ли что-то вроде этой работы для вас? http://plnkr.co/edit/SPSFGcB49qXmXROmNeHj?p=preview – sergiocruz
@sergiocruz, мне нужна директива, чтобы иметь изолированный объем, см. Принятый ответ. – Paul
True ... ну, я просто хочу указать, что конечный результат тот же, если вы добавите 'scope: {}' в объявление директивы. Плюс немного чище IMHO :) – sergiocruz