Когда мы не указываем ни scope:true
(новая область действия), ни scope:{}
(изолированная область действия) и когда мы повторно используем директиву, свойства, определенные в области действия, будут переопределены.
Для примера:
<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
Чтобы решить эту проблему, попробуйте любое из следующих решений.
Решение 1
transclde:true
создаст новый Scope. установите свойства в этой области вместо области действия директивы.
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
Решение 2 Вместо использования ng-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
Решение 1 может работать не во всех случаях. К тому времени, когда мы получим доступ к firstChild
, и если оно не будет готово, Solution1 завершится ошибкой.
Решение 2 чище и будет работать во всех случаях.
person
Vinay K
schedule
22.03.2015
scope: {}
в объявление директивы. Плюс немного чище ИМХО :) - person sergiocruz   schedule 25.03.2015