更新父范围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.$parent
variables。
只要准备一个方法来改变父范围的值,并在子范围内使用它。 喜欢这个:
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>
它将依次:
- 从它定义的范围中获取
viewData
对象 - 为其
myAttr
属性指定4。
为了访问父类中声明的variables,我们应该在子控制器或模板文件中使用$ parent
在控制器中
$scope.$parent.varaiable_name
在html模板中
ng-model="$parent.varaiable_name"