Javascript 什么';这是访问父控制器的一种优雅方式';来自子控制器的成员?
我在我的应用程序中使用controllerAs语法,我想从子控制器访问父控制器的函数,我知道这可以通过注入$scope来实现,但是考虑到Angular一直在努力从代码中去除$scope,我想知道是否有一种更优雅的方法来实现这一点,而不注入$scope 下面是一个HTML示例:Javascript 什么';这是访问父控制器的一种优雅方式';来自子控制器的成员?,javascript,angularjs,Javascript,Angularjs,我在我的应用程序中使用controllerAs语法,我想从子控制器访问父控制器的函数,我知道这可以通过注入$scope来实现,但是考虑到Angular一直在努力从代码中去除$scope,我想知道是否有一种更优雅的方法来实现这一点,而不注入$scope 下面是一个HTML示例: <div ng-controller="AppCtrl as app"> <div ng-controller="ChildCtrl as child"> </div> <
<div ng-controller="AppCtrl as app">
<div ng-controller="ChildCtrl as child">
</div>
</div>
我知道我可以注入$scope,然后通过
$scope.app.log()
访问日志函数,但是有没有更好的方法来访问日志而不注入$scope?
一个选项是使用Angular 1.5组件()
在子组件中,它看起来像这样:
.component('childComponent', {
require: {
parentCtrl: '^ parentCtrl'
}
controller: function() {
this.parentCtrl.anyMethod(); //here we are accessing parent's controller properties
}
...
});
这个答案是在被问到这个问题6个月后发布的,但我认为这可能有助于其他访问者查看我下面提出的解决方案 角度控制器具有原型继承,这意味着子控制器可以访问父控制器的
$scope
对象。如果不将属性和方法绑定到$scope
而使用this
关键字和控制器作为语法,则子$scope
将不能直接访问父级成员,但您仍然可以通过$scope.$parent
访问它们
也就是说,有两种可能(干净和简单)的方法来解决您的问题:
1) 您可以将属性和方法绑定到父控制器的$scope
对象,并通过任何子控制器中的$scope
直接访问它们(如果需要,您可以覆盖属性/方法,就像在常规类上那样)。
所以如果你定义
$scope.log = function() { console.log("output") }
在父控制器上,您的子控制器只需调用$scope.log()
即可访问它
2) 或者,由于您使用this
关键字和controller as
语法将控制器绑定到视图,因此子对象的$scope
对象将无法直接访问父对象的属性和方法,因为它们不是父对象的$scope
的成员,而是this
的成员,父控制器本身的实例。在这种情况下,您应该通过$scope.$parent
访问父级。除此之外,“app”(您为“AppCtrl”创建的别名,因此该控制器本身的实例)将是$scope.$parent
的属性。由于您将“log”方法定义为控制器本身的成员,而不是其$scope
对象,“log”是“app”的成员,您的子控制器可以访问父控制器的“log”方法:$scope.$parent.app.log()
下面是有关此主题的进一步阅读:可能重复的plunker链接似乎已断开。
$scope.log = function() { console.log("output") }