更新父范围variables

我有两个控制器一个包裹在另一个。 现在我知道子范围从父范围inheritance属性,但有没有办法更新父范围variables? 到目前为止,我还没有遇到任何明显的解决scheme。

在我的情况下,我有一个表格中的日历控制器。 我想从父范围(这是表单)更新开始date和结束date,以便表单在提交时具有开始date和结束date。

你需要在父范围中使用一个对象(不是基元),然后你可以直接从子范围更新它

家长:

app.controller('ctrlParent',function($scope){ $scope.parentprimitive = "someprimitive"; $scope.parentobj = {}; $scope.parentobj.parentproperty = "someproperty"; }); 

儿童:

 app.controller('ctrlChild',function($scope){ $scope.parentprimitive = "this will NOT modify the parent"; //new child scope variable $scope.parentobj.parentproperty = "this WILL modify the parent"; }); 

工作演示 : http : //jsfiddle.net/sh0ber/xxNxj/

请参阅AngularJS中范围原型/原型inheritance的细微差别?

还有一种方法可以完成这个任务,而不使用$scope.$parentvariables。

只要准备一个方法来改变父范围的值,并在子范围内使用它。 喜欢这个:

 app.controller('ctrlParent',function($scope) { $scope.simpleValue = 'x'; $scope.changeSimpleValue = function(newVal) { $scope.simpleValue = newVal; }; }); app.controller('ctrlChild',function($scope){ $scope.changeSimpleValue('y'); }); 

它也起作用,并给你更多的控制价值的变化。

然后,您甚至可以通过HTML调用该方法,例如: <a ng-click="changeSimpleValue('y')" href="#">click me!</a>

这也适用(但不确定这是否遵循最佳实践)

 app.controller('ctrlParent',function($scope) { $scope.simpleValue = 'x'; }); app.controller('ctrlChild',function($scope){ $scope.$parent.simpleValue = 'y'; }); 

当您将原始属性分配给作用域时,即使父作用域具有相同名称的属性,它也始终是作用域的本地作用域(可能即时创build)。 这是一个devise决定,并且是一个很好的恕我直言。

如果您需要在父范围内从视图中更改一些基本元素(整数,布尔值,string),则需要将其作为该范围内另一个对象的属性,因此该赋值可能为:

 <a ng-click="viewData.myAttr = 4">Click me!</a> 

它将依次:

  1. 从它定义的范围中获取viewData对象
  2. 为其myAttr属性指定4。

为了访问父类中声明的variables,我们应该在子控制器或模板文件中使用$ parent

在控制器中

 $scope.$parent.varaiable_name 

在html模板中

 ng-model="$parent.varaiable_name"