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)
| 归档时间: |
|
| 查看次数: |
12096 次 |
| 最近记录: |