当使用ng-repeat时,Angular $ parent和$ parent.$ parent是相同的控制器

sti*_*ife 5 parent angularjs angularjs-scope

我想了解为什么当ng-repeat在重复的项目上使用带有某个控制器时,该项目的父项和该项目的祖父是同一个控制器.我期待祖父成为父控制器的父母,而不是同一个控制器.

这里的代码澄清了这一点

HTML

<div ng-controller="MainController">
  {{name}}
  <div ng-controller="SecondController">
  {{name}}
    <ul>
      <li ng-repeat="item in list" ng-controller="ItemController">
         {{item.name}} {{$parent.name}} {{myDad}} {{myGrandpa}}
      </li>
    </ul>
    <div ng-controller="ThirdController">
         {{name}} {{$parent.name}} {{myDad}} {{myGrandpa}}
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

JS

angular.module('app', []);


angular.module('app')
  .controller('MainController', function($scope) {
  $scope.name = "MainController";
 })
.controller('SecondController', function($scope) {
  $scope.name = "SecondController";
  $scope.list = [
   {'name': 'aaa'}
  ];
})
.controller('ItemController', function($scope) {
  $scope.name = "ItemController";
  $scope.myDad = $scope.$parent.name;
  $scope.myGrandpa = $scope.$parent.$parent.name;
})
.controller('ThirdController', function($scope) {
  $scope.name = "ThirdController";
  $scope.myDad = $scope.$parent.name;
  $scope.myGrandpa = $scope.$parent.$parent.name;
});
Run Code Online (Sandbox Code Playgroud)

这里有一个CodePen

小智 4

在 Angular 中,$scope 继承而不是控制器。

ng-controller 创建的每个控制器都会创建一个新的 $scope (childScope),它继承自它所在的 $scope。我想您可能想阅读这个答案以了解 $scope 到底是如何继承的(原型继承)。

请注意,您不必使用“$parent”来获取父级 $scope 的名称,例如,如果您要从 ItemController 中删除 $scope.name 并尝试绑定 {{name}} 您的模板将被编译和链接,并且在您的示例中 {{name}} 的值将是“SecondController”。

关于 $broadcast,您应该尽量避免使用 $rootScope.$broadcast,因为它会将事件分派到应用程序中的所有 $scope。我不确定你的用例是什么,但是如果你想执行“MainController”中定义的方法,例如,你可以调用它

angular.module('app', []);


angular.module('app')
  .controller('MainController', function($scope) {
  $scope.name = "MainController";
  $scope.doSomething = function() {
    console.log("Do it");
  }
 })
.controller('SecondController', function($scope) {
  $scope.name = "SecondController";
  $scope.list = [
   {'name': 'aaa'}
  ];
})
.controller('ItemController', function($scope) {
  $scope.name = "ItemController";
  $scope.myDad = $scope.$parent.name;
  $scope.myGrandpa = $scope.$parent.$parent.name;
  $scope.clickItem = function() {
     console.log("Item clicked");
     $scope.doSomething(); // The method from "MainController" will be executed unless ItemController is isolated 
  }
})
.controller('ThirdController', function($scope) {
  $scope.name = "ThirdController";
  $scope.myDad = $scope.$parent.name;
  $scope.myGrandpa = $scope.$parent.$parent.name;
});
Run Code Online (Sandbox Code Playgroud)