Angularjs 带有根元素且带有ngRepeat和replace的指令:true

Angularjs 带有根元素且带有ngRepeat和replace的指令:true,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,有人能解释以下行为背后的根本原因吗 如果具有隔离作用域作用域:{}的指令的根元素为ng repeat AND replace:true,则它会断开隔离作用域,这意味着隔离作用域在指令内不可访问/可见,并且指令开始从外部作用域接收变量 下面是我可以做的一个重复性最低的例子: app.controller('MainCtrl', function($scope) { $scope.name = 'MainCtrl'; }); app.directive("foo", function(){

有人能解释以下行为背后的根本原因吗

如果具有隔离作用域作用域:{}的指令的根元素为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>
将不可重复的根添加到模板或设置replace:false将呈现预期的结果foo


这不仅仅发生在ng repeat上,其他任何创建类似ng if的作用域的指令也会发生这种情况。这似乎是因为指令的隔离作用域被ng repeat的子作用域覆盖了。由于replace:true选项ng repeat成为指令源元素的一部分,即,ng repeat的子范围是从最终父范围MainCtrl计算的,这似乎是错误的,这会导致整个指令模板绑定到控制器的子范围,并且任何插值都会根据这个范围。因此,您可以在指令中看到主控制器的作用域被扩展。这似乎是一个bug。

这不仅仅发生在ng repeat上,其他任何创建类似ng if范围的指令也会发生这种情况。这似乎是因为指令的隔离作用域被ng repeat的子作用域覆盖了。由于replace:true选项ng repeat成为指令源元素的一部分,即,ng repeat的子范围是从最终父范围MainCtrl计算的,这似乎是错误的,这会导致整个指令模板绑定到控制器的子范围,并且任何插值都会根据这个范围。因此,您可以在指令中看到主控制器的作用域被扩展。这似乎是一个bug。

我相信这不仅仅是为了ng repeat,它可能发生在任何创建子作用域的事情上,例如:ng如果子作用域覆盖了指令的隔离作用域,并替换为true。因为我相信替换发生在早期编译阶段。这似乎是正确的。注意把这作为一个正确的答案吗?显然已知的错误:我相信这不仅仅是为了ng repeat,它可能发生在任何创建子作用域的事情上,例如:ng如果并且使用replace true,子作用域覆盖了指令的隔离作用域。因为我相信替换发生在早期编译阶段。这似乎是正确的。你想把这当作一个正确的答案吗?显然是已知的错误: