为了账号安全,请及时绑定邮箱和手机立即绑定

AngularJS-访问子范围

/ 猿问

AngularJS-访问子范围

吃鸡游戏 2019-10-06 14:58:56

如果我有以下控制器:


function parent($scope, service) {

    $scope.a = 'foo';


    $scope.save = function() {

        service.save({

            a:  $scope.a,

            b:  $scope.b

        });

    }

}


function child($scope) {

    $scope.b = 'bar';

}

parent读b出的正确方法是child什么?如果有必要定义b中parent,也不会使它语义上不正确假设b是描述相关的东西的属性child,而不是parent?


更新:对此进行进一步的思考,如果有一个以上的孩子b,将会parent在b检索上产生冲突。我的问题是,什么是访问的正确方法是b从parent?


查看完整描述

4 回答

?
FFIVE

尽管jm-的答案是处理这种情况的最佳方法,但为了将来参考,可以使用范围的$$ childHead,$ childTail,$ nextSibling和$$ prevSibling成员来访问子范围。这些没有记录在案,因此它们可能会在不通知的情况下进行更改,但是如果您确实需要遍历作用域,它们就在那。


// get $$childHead first and then iterate that scope's $$nextSiblings

for(var cs = scope.$$childHead; cs; cs = cs.$$nextSibling) {

    // cs is child scope

}


查看完整回答
反对 2019-10-06
?
慕的地2183247

一种可能的解决方法是使用init函数将子控制器注入到父控制器中。


可能的实现:


<div ng-controller="ParentController as parentCtrl">

   ...


    <div ng-controller="ChildController as childCtrl" 

         ng-init="ChildCtrl.init()">

       ...

    </div>

</div>

ChildController您在哪里:


app.controller('ChildController',

    ['$scope', '$rootScope', function ($scope, $rootScope) {

    this.init = function() {

         $scope.parentCtrl.childCtrl = $scope.childCtrl;

         $scope.childCtrl.test = 'aaaa';

    };


}])

因此,现在ParentController您可以使用:


app.controller('ParentController',

    ['$scope', '$rootScope', 'service', function ($scope, $rootScope, service) {


    this.save = function() {

        service.save({

            a:  $scope.parentCtrl.ChildCtrl.test

        });

     };


}])

重要提示:

要正常工作,您必须使用指令ng-controller并使用as与我在html eg中相同的方式重命名每个控制器。


提示:在此过程中,

请使用chrome插件ng-inspector。它会帮助您理解树。


查看完整回答
反对 2019-10-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信