Angularjs 角度指令作用域问题

Angularjs 角度指令作用域问题,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我现在对angular有一些经验,但我仍然无法理解。我有一个指令被另一个指令所屏蔽。Directive1与控制器位于同一元素上,并且它们共享相同的作用域。我希望directive2从controller中的作用域继承,但它们不是父/子,而是兄弟。我错过了什么 代码如下: angular.module('myModule',[]) .controller('controller',['$scope',function($scope){ log('from controller',$scope);

我现在对angular有一些经验,但我仍然无法理解。我有一个指令被另一个指令所屏蔽。Directive1与控制器位于同一元素上,并且它们共享相同的作用域。我希望directive2从controller中的作用域继承,但它们不是父/子,而是兄弟。我错过了什么

代码如下:

angular.module('myModule',[])
.controller('controller',['$scope',function($scope){
log('from controller',$scope);
}])
.directive('directive1',function(){
返回{
限制:“A”,
替换:正确,
是的,
模板:“directive1

” +' ', 链接:函数($scope、elem、attrs){ log('from directive1',$scope); } } }) .directive('directive2',function(){ 返回{ 限制:“A”, 链接:函数($scope、elem、attrs){ log('from directive2',$scope); } } });
关联的html:

<div x-directive1 ng-controller="Controller">
    <div x-directive2> <p>directive2</p> </div>
</div>

指令2

以及指向JSFIDLE的链接:

我不会使用$scope作为这些链接函数的命名参数,而是使用'scope'。 这使控制器具有方向性,但我认为这不是你真正想要的。 你能不能把控制器移到一个封闭的div?那么directive2实际上将继承controllers范围

<div ng-controller="Controller">
    <div x-directive1>
        <div x-directive2> <p>directive2</p> </div>
    </div>
</div>

指令2

我不会使用$scope作为这些链接函数的命名参数,而是使用'scope'。 这使控制器具有方向性,但我认为这不是你真正想要的。 你能不能把控制器移到一个封闭的div?那么directive2实际上将继承controllers范围

<div ng-controller="Controller">
    <div x-directive1>
        <div x-directive2> <p>directive2</p> </div>
    </div>
</div>

指令2


问题在于将直接放在执行转换的父指令上。创建一个换行元素并将指令放置在该元素上

像这样:

<section ng-controller="Controller">
    <div x-directive1>
        <div x-directive2> <p>directive2</p> </div>
    </div>
</section>

指令2

我已经完成了安装,并在其中安装了修复程序

为什么内部指令显示为兄弟(来自官方AngularJS指令文档):

transclude—编译元素的内容并使其可用 遵守指令。通常与ngTransclude一起使用。优势 转换是指链接函数接收转换 预先绑定到正确范围的函数在典型设置中 小部件创建一个隔离作用域,但转换不是一个隔离作用域 子级,但隔离作用域的同级。这使得 要具有私有状态的小部件,以及要绑定到的转换 父(预隔离)范围

在本例中,您不是在父指令上声明隔离作用域,而是在父指令上声明控制器。转换导致子指令成为其父指令和控制器的同级作用域,因为控制器位于父指令上

我的建议是,避免下达指令


我希望这会有所帮助。

问题在于将直接放在执行转换的父指令上。创建一个换行元素并将指令放置在该元素上

像这样:

<section ng-controller="Controller">
    <div x-directive1>
        <div x-directive2> <p>directive2</p> </div>
    </div>
</section>

指令2

我已经完成了安装,并在其中安装了修复程序

为什么内部指令显示为兄弟(来自官方AngularJS指令文档):

transclude—编译元素的内容并使其可用 遵守指令。通常与ngTransclude一起使用。优势 转换是指链接函数接收转换 预先绑定到正确范围的函数在典型设置中 小部件创建一个隔离作用域,但转换不是一个隔离作用域 子级,但隔离作用域的同级。这使得 要具有私有状态的小部件,以及要绑定到的转换 父(预隔离)范围

在本例中,您不是在父指令上声明隔离作用域,而是在父指令上声明控制器。转换导致子指令成为其父指令和控制器的同级作用域,因为控制器位于父指令上

我的建议是,避免下达指令


我希望这会有所帮助。

我认为您需要在指令之间设置层次“require”链接。查看这个关于分层指令的教程,我认为您需要设置指令之间的分层“require”链接。查看这篇关于分层指令的教程。对scope变量使用$scope是个坏主意,但不是问题的原因。这里描述的问题是一个作用域层次结构问题,具体原因是在同样承载ng控制器指令的第一个指令中使用ng TRANCLUDE。提供解决方案的JSFIDLE和指向详细说明的链接。对scope变量使用$scope不是一个好主意,但不是导致此问题的原因。这里描述的问题是一个作用域层次结构问题,具体原因是在同样承载ng控制器指令的第一个指令中使用ng TRANCLUDE。提供解决方案的JSFIDLE和指向详细说明的链接。