有人可以解释以下行为背后的根本原因吗?
如果指令具有隔离范围scope: {}
有一个根元素ng-repeat
AND replace: true
然后它“破坏”隔离范围,这意味着隔离范围在指令内不可访问/可见,并且指令开始从外部范围接收变量。
这是我可以制作的最低限度可重现的示例:
app.controller('MainCtrl', function($scope) {
$scope.name = 'MainCtrl';
});
app.directive("foo", function(){
return {
replace: true,
scope: {},
template: "<div ng-repeat='item in [1]'>{{name}}</div>",
controller: function($scope){
$scope.name = "foo";
}
};
});
以下视图将呈现“MainCtrl”:
<div ng-controller="MainCtrl">
<foo></foo>
</div>
添加一个非ng-repeat
- 能够根到模板或设置replace: false
呈现预期结果“foo”。
Plunker
它不仅仅发生在 ng-repeat 上,这似乎发生在任何其他创建作用域的指令上,例如ng-if
以及。看起来,这是因为指令的独立作用域被 ng-repeat 的子作用域覆盖。并且因为replace:true
选项 ng-repeat 成为指令源元素的一部分,即<foo></foo>
ng-repeat 的子作用域是根据最终父作用域计算的MainCtrl
(这似乎是错误的)这会导致整个指令模板绑定到控制器的子范围,并且任何插值都会针对该范围进行评估。因此,您会看到主控制器的范围在指令中得到扩展。这似乎是一个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)