2016-08-17 42 views
2

我在我的应用程序中使用controllerAs语法,我想从子控制器访问父控制器的函数,我知道这是可以通过注入$ scope来实现的,但是考虑到Angular已经试图很难从代码中摆脱$ scope, '想知道是否有一个更优雅的方式做到这一点,而不注入$ scope?什么是从子控制器访问父控制器成员的优雅方式?

下面是HTML的例子:

<div ng-controller="AppCtrl as app"> 
    <div ng-controller="ChildCtrl as child"> 
    </div> 
</div> 

和相应的控制器:

angular.module('test').controller('AppCtrl', function() { 
    var vm = this; 
    vm.log = function() { 
    console.log("Output"); 
    } 
} 

angular.module('test').controller('ChildCtrl', function() { 
    var vm = this; 
    // Here I want to access parent's log() function 
} 

我知道我可以注入$范围,然后通过$scope.app.log()访问日志功能,但有一个bettter方式无需注入即可访问日志$scope?

+0

[从子控制器angularjs访问父作用域(的可能的复制http://stackoverflow.com/questions/21453697/angularjs-access-parent-scope -from-child-controller) – Ted

回答

2

一种选择是使用Angular 1.5组件(docs)。

它看起来像这样的子组件:

.component('childComponent', { 
    require: { 
    parentCtrl: '^ parentCtrl' 
    } 
    controller: function() { 
    this.parentCtrl.anyMethod(); //here we are accessing parent's controller properties 
    } 

    ... 

}); 
+0

重新链接似乎破裂。 – didierc

+1

好吧,你想链接到我想的文档示例... – didierc

1

这个答案被张贴6个月左右有人问后,但我认为这可能是有益的其他旅客检查我提出的解决方案下面。

角控制器具有原型继承,这意味着子控制器的$scope对象可以访问。如果您没有将您的属性和方法绑定到$scope,而是使用this关键字和controller as语法,则子女的$scope将无法​​直接访问父母的成员,但仍然可以通过$scope.$parent访问它们。

这就是说,有两种可能的(清洁和简单)的方法来解决你的问题:

1)你可以绑定的属性和方法,你的父母控制器的$scope对象,必须通过$scope直接访问它们在任何子控制器中(如果需要,可以覆盖属性/方法 - 就像您在常规Class上那样)。 所以,如果你的父母控制器上定义

$scope.log = function() { console.log("output") } 

,你的孩子控制器具有通过简单地调用$scope.log()访问它。 Check this fiddle

2)或者,由于您使用的是this关键字和controller as语法来绑定控制器的意见,孩子的$scope对象不会对父的属性和方法的直接访问,因为这些都不是父母的$scope成员但是this,父控制器本身的实例。在这种情况下,您应该通过$scope.$parent访问父级。除此之外,“app”(您为“AppCtrl”创建的别名,即该控制器本身的实例)将是$scope.$parent的一个属性。由于您将“日志”方法定义为控制器本身的成员,而不是其对象,因此“日志”是“应用程序”的成员,您的子控制器可以访问父级的“日志”方法,如下所示:$scope.$parent.app.log()Check this fiddle

下面是一些关于这个论题进一步阅读:https://github.com/angular/angular.js/wiki/Understanding-Scopes