加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – Angular $parent和$parent.$parent在使用ng-repeat

发布时间:2020-12-17 07:17:08 所属栏目:安全 来源:网络整理
导读:我想了解为什么当在重复项目上使用某个控制器的ng-repeat时,该项目的父项和该项目的祖父是同一个控制器.我期待祖父成为父控制器的父母,而不是同一个控制器. 这里的代码澄清了这一点 HTML div ng-controller="MainController" {{name}} div ng-controller="Se
我想了解为什么当在重复项目上使用某个控制器的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>

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

这里一个CodePen

解决方法

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

由ng-controller创建的每个控制器都会创建一个新的$scope(childScope),它继承自它所存在的$scope.我想你可能想要阅读这个answer以了解$scope是如何继承的(原型继承).

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

关于$broadcast,你应该尽量避免使用$rootScope.$broadcast,因为它会向你的应用程序中的所有$scope发送一个事件.我不确定你的用例是什么,但是如果你想执行一个在你的“MainController”中定义的方法,你可以调用它作为例子

angular.module('app',function($scope) {
  $scope.name = "MainController";
  $scope.doSomething = function() {
    console.log("Do it");
  }
 })
.controller('SecondController',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;
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读