我有两个指令,一个指向元素,另一个指向属性
<bar-foo special></bar-foo>
现在问题是特殊指令需要在barFoo
指令的范围内定义一些东西。但是, barFoo 指令具有私有范围
angular.module('App')
.directive('barFoo', function() {
return {
restrict: 'E',
template: '<div><h1 ng-if="doit">Bar Foo</h1></div>',
scope: { /* private scope */ },
....
}
});
doit
值由特殊指令
angular.module('App')
.directive('special', function() {
return {
restrict: 'A',
link: function (scope) {
scope.doit = false;
}
}
});
问题是 barFoo 有一个私有作用域,doit
没有添加到该作用域(但是$ parent)。我想知道是否可以让特殊指令与 barFoo 指令具有相同的范围?
我只能想到以下解决方案,1)添加额外的属性
<bar-foo special doit="doit"></bar-foo>
或2)将 barfoo 的模板html更改为
<div><h1 ng-if="$parent.doit">Bar Foo</h1></div>
虽然这很有效,但感觉有点像解决方法!
答案 0 :(得分:3)
您建议的解决方案不是一种解决方法,实际上是一种可以接受的方式来满足您的需求。
AngularJS指令提供了隔离范围的便利,这是有充分理由的。考虑到你想要使用多个指令。作为复制元素的时间,您希望确保范围与所有其他范围保持隔离。
除了你建议的2个解决方案,还可以有第3个解决方案:
创建一个包含service
变量的angularjs doit
。为get()
和update()
此变量创建服务方法。
然后,您可以在两个指令中注入此service
,并通过调用服务方法在指令中共享doit
变量。这样,无论您在指令中使用何种范围,都可以确保共享相同的doit
变量。
请注意,angularjs service
是单例,因此每次在服务上调用get()或update()时,您都在处理doit
变量的相同实例。