使用AngularJs ControllerAs方法,如何从子控制器调用父控制器中的函数?

使用AngularJs ControllerAs方法,如何从子控制器调用父控制器中的函数?,angularjs,Angularjs,我知道你以前可能见过这个问题,但真的有答案吗?我开始怀疑了。 简单地说,我使用的是推荐的controlleras语法,访问视图中的父控制器成员表单没有问题,但我无法从子作用域的构造函数中执行此操作。下面是我现在所得到的一些代码: myapp.controller(“ParentController”,function()){ this.selectedItem={ Id:1, 名称:'item1' }; this.setSelectedItem=功能(项){ this.selectedItem=

我知道你以前可能见过这个问题,但真的有答案吗?我开始怀疑了。 简单地说,我使用的是推荐的controlleras语法,访问视图中的父控制器成员表单没有问题,但我无法从子作用域的构造函数中执行此操作。下面是我现在所得到的一些代码:
myapp.controller(“ParentController”,function()){
this.selectedItem={
Id:1,
名称:'item1'
};
this.setSelectedItem=功能(项){
this.selectedItem=项目;
//做其他事情
}
});
myapp.controller(“ChildController”,function()){
this.onItemChanged=函数(newItem){
//如何从这里调用父控制器实例
}

});要尽可能清楚地回答您的问题,您首先必须了解控制器as语法的实际工作原理

将控制器用作并不意味着您没有使用
$scope
。实际上,
$scope
仍然存在。控制器As是一种速记,它在
$scope
上创建一个对象,并将通过
分配的属性附加到该对象。在视图方面,此对象显式绑定到所有控件。您仍然可以引用
$scope.vm.property
。但是,由于
$scope
在该场景中是隐式的,因此不需要创建对它的依赖关系

在嵌套场景中仍然可以访问父控制器的
vm
对象的属性,但是仅当每个控制器由不同的名称引用时才可以访问。如果您的对象是
outerScope
innerScope
,那么在
innerScope
的HTML模板中,您仍然可以引用
outerScope.someProperty

但是,如果所有控制器的名称相同(即
vm
),则访问父控制器的唯一方法是通过子作用域的属性,该属性别名为
$scope
属性,引入
$scope
依赖关系


实际上,当您在另一个控制器中有一个控制器时,最里面的项作为一个指令包装自己的内容,并通过一个隔离作用域显式定义它需要哪些变量,这会更简洁。但是,如果不需要这样做,则应使内部控制器的名称与外部控制器的名称不同。

使用嵌套控制器实际上是一种反模式。无论何时嵌套内容,都应该使用指令。最好的控制器是自包含的,不依赖于外部源的行为。使用$scope,您可以使用$scope从子级访问父级的$scope。$parent。因此,您可以尝试将方法附加到$scope,而不是“this”。顺便说一句,一个更好的共享方法是编写angular服务,它充当“库”,是的,正如Claies所说,这是一个反模式。非常感谢Raphaël,但我正在尽量减少$scope服务的使用,因为它在2.0版本中不会出现(大震..我知道)我在这里如何使用服务,鉴于'selectedItem'属性绑定到网格,因此我需要在controlleragain中对其进行更改,为什么您不使用此行为的指令?我非常感谢详细的回答Claris,非常感谢。我知道Controller-As语法不能替代$scope服务,但只要迁移到AngularJs v2.0,遵循此语法将有助于转换,$scope服务将不在那里。还有一种方法可以在嵌套场景中访问父控制器的vm对象的属性,但不是从HTML模板访问子控制器本身中的表单吗?如果不执行类似于
$broadcast
的操作,这将再次引入
$scope
。这又回到了指令,指令可以有一个由父控制器设置的参数传递到隔离作用域。谢谢Claris,这对我来说现在更清楚了,我相信这一讨论也会对其他许多人有用