以角度更新父范围变量

Mal*_*001 113 javascript angularjs angularjs-scope

我有两个控制器,一个包裹在另一个.现在我知道子范围从父范围继承属性,但有没有办法更新父范围变量?到目前为止,我没有遇到任何明显的解决方案.

在我的情况下,我在表单中有一个日历控制器.我想从父作用域(即表单)更新开始日期和结束日期,以便表单在提交时具有开始日期和结束日期.

Dan*_*Dan 190

您需要在父作用域中使用对象(而不是基元),然后您才能直接从子作用域更新它

家长:

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

儿童:

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";
});
Run Code Online (Sandbox Code Playgroud)

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

请参阅AngularJS中范围原型/原型继承的细微差别是什么?


Rav*_*ker 116

还有一种方法可以执行此任务并且不使用该$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');
});
Run Code Online (Sandbox Code Playgroud)

它也有效,让您可以更好地控制价值变化.

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

  • 我不知道为什么这个答案没有得到更多的赞成,这是一个很好的建议. (10认同)
  • 未来的读者:所有这些高五的评论都有点误导.为每个变量创建两个setter函数(它们是"不必要的对象")是一个笨重且不必要的继承的kludge,而不是Angular方式.Angular的创造者Misko Hevery给出了一个讲话,他教导说"每当你有模型时,那里必须有一个点.如果你没有一个点,你做错了."[Misko视频](https://www.youtube.com/watch?v=ZhfUv0spHCY)@ 29:19 (3认同)

小智 5

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

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

app.controller('ctrlChild',function($scope){
    $scope.$parent.simpleValue = 'y';
});
Run Code Online (Sandbox Code Playgroud)