我有两个控制器,一个包裹在另一个中。现在我知道子作用域继承了父作用域的属性,但是有没有办法更新父作用域变量?到目前为止,我还没有遇到任何明显的解决方案。
在我的情况下,我在表单中有一个日历控制器。我想从父范围(即表单)更新开始和结束日期,以便表单在提交时具有开始和结束日期。
我有两个控制器,一个包裹在另一个中。现在我知道子作用域继承了父作用域的属性,但是有没有办法更新父作用域变量?到目前为止,我还没有遇到任何明显的解决方案。
在我的情况下,我在表单中有一个日历控制器。我想从父范围(即表单)更新开始和结束日期,以便表单在提交时具有开始和结束日期。
您需要在父作用域中使用一个对象(不是基元),然后您将能够直接从子作用域更新它
家长:
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/
还有另一种方法可以完成此任务并且不使用$scope.$parent
变量。
只需准备一种方法来更改父作用域中的值并在子作用域中使用它。像这样:
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';
});
将原始属性分配给作用域时,它始终是作用域的本地属性(可能是动态创建的),即使父作用域具有相同名称的属性。这是一个设计决定,恕我直言,这是一个很好的决定。
如果您需要更改父作用域中的某些原语(整数、布尔值、字符串),从视图中看,您需要它是该作用域中另一个对象的属性,因此赋值可能为:
<a ng-click="viewData.myAttr = 4">Click me!</a>
它会反过来:
viewData
从它定义的任何范围获取对象myAttr
属性。为了访问在父级中声明的变量,我们应该在子控制器或模板文件中使用 $parent
在控制器中
$scope.$parent.varaiable_name
在 html 模板中
ng-model="$parent.varaiable_name"