Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这是访问父控制器的一种优雅方式';来自子控制器的成员?_Javascript_Angularjs - Fatal编程技术网

Javascript 什么';这是访问父控制器的一种优雅方式';来自子控制器的成员?

Javascript 什么';这是访问父控制器的一种优雅方式';来自子控制器的成员?,javascript,angularjs,Javascript,Angularjs,我在我的应用程序中使用controllerAs语法,我想从子控制器访问父控制器的函数,我知道这可以通过注入$scope来实现,但是考虑到Angular一直在努力从代码中去除$scope,我想知道是否有一种更优雅的方法来实现这一点,而不注入$scope 下面是一个HTML示例: <div ng-controller="AppCtrl as app"> <div ng-controller="ChildCtrl as child"> </div> <

我在我的应用程序中使用controllerAs语法,我想从子控制器访问父控制器的函数,我知道这可以通过注入$scope来实现,但是考虑到Angular一直在努力从代码中去除$scope,我想知道是否有一种更优雅的方法来实现这一点,而不注入$scope

下面是一个HTML示例:

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