AngularJS - 访问子范围

Azi*_*ari 109 angularjs

如果我有以下控制器:

function parent($scope, service) {
    $scope.a = 'foo';

    $scope.save = function() {
        service.save({
            a:  $scope.a,
            b:  $scope.b
        });
    }
}

function child($scope) {
    $scope.b = 'bar';
}
Run Code Online (Sandbox Code Playgroud)

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

更新:进一步思考它,如果有一个以上的孩子b,它将产生一个冲突parent,b以便检索.我的问题是,什么是访问的正确方法是bparent

jai*_*ime 161

AngularJS中的范围使用原型继承,当在子范围内查找属性时,解释器将从子项开始查找原型链并继续查看父项,直到找到属性,而不是相反.

查看Vojta对该问题的评论https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J

简而言之:您无法从父作用域访问子作用域.

你的解决方案

  1. 在父项中定义属性并从子级访问它们(请阅读上面的链接)
  2. 使用服务来共享状态
  3. 通过事件传递数据.$emit将事件向上发送给父级,直到根范围并向下$broadcast发送事件.这可能有助于您保持语义正确.

  • 另外$ emit和$ broadcast之间的差异是$ emit可取消和$ broadcast不. (8认同)

Jus*_*nen 80

虽然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
}
Run Code Online (Sandbox Code Playgroud)

小提琴


小智 48

你可以试试这个:

$scope.child = {} //declare it in parent controller (scope)
Run Code Online (Sandbox Code Playgroud)

然后在子控制器(范围)中添加:

var parentScope = $scope.$parent;
parentScope.child = $scope;
Run Code Online (Sandbox Code Playgroud)

现在父母可以访问孩子的范围.

  • @IfTrue我相信不需要$ watch().这些是对象,它们通过引用传递. (2认同)
  • @Swanidhi =我知道你的意思,我也这么想,但是当我在撰写评论时进行实验时,它没有用.对于它的价值,我从这样做切换到发射/广播. (2认同)