Angularjs 使用ng repeat时,$parent和$parent.$parent是同一控制器

Angularjs 使用ng repeat时,$parent和$parent.$parent是同一控制器,angularjs,angularjs-scope,parent,Angularjs,Angularjs Scope,Parent,我想了解为什么在重复项目上使用带有特定控制器的ng repeat时,该项目的父项和该项目的父项是同一控制器。我希望祖父是父控制器的父控制器,而不是同一控制器 这里的代码澄清了这一点 HTML <div ng-controller="MainController"> {{name}} <div ng-controller="SecondController"> {{name}} <ul> <li ng-repeat="ite

我想了解为什么在重复项目上使用带有特定控制器的
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>

这里有一个

来回答您的评论问题,是的,您应该在系统中使用$rootScope作为消息代理

关于具体内容,这与指令的范围有关,处理此代码的更好方法(对于可能遇到此问题的其他人)如下所示:


{{main.name}
{{second.name}}
  • {{item.name}{{second.name}{{{myDad}}{{my爷爷}}
{{name}{{third.name}{{{myDad}}{{mygrandge}}
根据您关于想要广播的评论,您可以使用如下函数,并从孩子处调用它:

// in MainController:
$scope.broadcastMain = function(message) {
    $scope.$broadcast(message);
};

然后该函数被继承,但它的闭包将使
$scope
与创建它的作用域相同,因此您可以使用
$scope.broadcast()
访问它的子函数。()

在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;
});

ng repeat可能有自己的作用域,许多其他指令可以创建自己的作用域,因此最好不要依赖
$parent
。作用域属性是继承的,因此如果您想确保您有权访问子对象中的某个元素,您可以始终创建一个对象,如
$Scope.secondData={}
和访问您的示波器上的
secondData
。但在我的情况下,我想
$broadcast
在孙辈的某个功能之后从祖辈那里得到一些东西。那么,
$rootScope
可能是最好的选择?
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;
});