多个指令需要共享相同的私有范围

时间:2014-10-07 13:36:51

标签: javascript angularjs angularjs-directive angularjs-scope

我有两个指令,一个指向元素,另一个指向属性

<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>

虽然这很有效,但感觉有点像解决方法!

1 个答案:

答案 0 :(得分:3)

您建议的解决方案不是一种解决方法,实际上是一种可以接受的方式来满足您的需求。

AngularJS指令提供了隔离范围的便利,这是有充分理由的。考虑到你想要使用多个指令。作为复制元素的时间,您希望确保范围与所有其他范围保持隔离。

除了你建议的2个解决方案,还可以有第3个解决方案:

创建一个包含service变量的angularjs doit。为get()update()此变量创建服务方法。 然后,您可以在两个指令中注入此service,并通过调用服务方法在指令中共享doit变量。这样,无论您在指令中使用何种范围,都可以确保共享相同的doit变量。

请注意,angularjs service是单例,因此每次在服务上调用get()或update()时,您都在处理doit变量的相同实例。