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