我有一个具有非隔离范围的AngularJS指令。但是,我确实有一个变量,我希望仅与指令隔离(它是一个“isOpen”标志)。例如:
app.directive('myDir', function() {
return {
restrict: 'A',
scope: {},
link: function(scope, element, attrs) {
scope.isOpen = false;
}
}
});
......给了我一个孤立的范围。我需要能够在myDir之前的某个地方分配一个控制器,并且在myDir中可以使用该控制器的范围,同时隔离scope.isOpen,这样我就可以在一个页面上拥有该指令的多个实例。
答案 0 :(得分:8)
即使您已通过指令范围内的$parent
属性隔离了作用域,也可以在指令内部使用父控制器的作用域。
app.directive('myDir', function() {
return {
restrict: 'A',
scope: {},
link: function(scope, element, attrs) {
scope.isOpen = false;
scope.$parent.whatever; //this came from your containing controller.
}
}
});
虽然要小心......以这种方式紧密耦合指令和控制器变得非常容易。在大多数情况下,最好将范围的属性与标记中的范围声明和属性链接起来,如下所示:
指令:
app.directive('myDir', function() {
return {
restrict: 'A',
scope: {
propFromParent: '=prop',
funcFromParent: '&func'
},
link: function(scope, element, attrs) {
scope.isOpen = false;
scope.$parent.whatever; //this came from your containing controller.
}
}
});
标记:
<my-dir prop="foo" func="bar()"></my-dir>
你的控制器:
app.controller('SomeCtrl', function($scope) {
$scope.foo = 'test';
$scope.bar = function() {
$scope.foo += '!';
};
});