0

我有两个指令,一个被限制的元素,另一个属性多指令需要共享相同的专用范围

<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不会被添加到该范围(但是$父母)。我想知道是否有可能让特殊指令与barFoo指令具有相同的范围?

我只能想到通过以下方法解决:1)添加额外的属性

<bar-foo special doit="doit"></bar-foo> 

或2)改变barfoo

<div><h1 ng-if="$parent.doit">Bar Foo</h1></div> 

虽然这个伟大的工程模板HTML,这感觉有点像解决方法!

+1

任何时候当我遇到美元父母时,这表示我正在以某种不合意的方式做某件事。你似乎有同样的感觉。我会亲自为第一个解决方案 – Blackunknown 2014-10-07 13:44:54

回答

3

您建议的解决方案不是一种解决方法,实际上是一种可以接受的方式来执行您在此处所需的操作。

AngularJS指令提供了一个很好的理由隔离范围的设施。考虑到你想使用一个指令多个号码。时间作为一个复制的元素,你想确保范围与所有其他范围保持隔离。

除了2个解决方案,您的建议,可以有第三个解决方案,以及:

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

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

+0

+1提供服务建议;这真的是最好的解决方案。 – 2014-10-07 13:55:25