在 AngularJS 中更新父作用域变量

IT技术 javascript angularjs angularjs-scope prototype angularjs-controller
2021-03-14 04:33:41

我有两个控制器,一个包裹在另一个中。现在我知道子作用域继承了父作用域的属性,但是有没有办法更新父作用域变量?到目前为止,我还没有遇到任何明显的解决方案。

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

5个回答

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

家长:

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 中范围原型/原型继承的细微差别是什么?

谢谢,这有效!我绝对应该仔细阅读这个(原型继承和原语)。你能推荐一本比你的 SO 链接解释得更多的好书吗?
2021-04-17 04:33:41

还有另一种方法可以完成此任务并且不使用$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>

很好的解决方案!这是有效的,因为当在当前 $scope 中找不到某些东西时,Angular 在 $parent 中查找。docs.angularjs.org/guide/scope(参见“范围层次结构”)。
2021-04-17 04:33:41
未来的读者:所有这些高五评论都有点误导。为每个变量创建两个 setter 函数(它们是“不必要的对象”)是一种笨拙且不必要的继承组合,而不是 Angular 的方式。Angular 的创造者 Misko Hevery 在演讲中说道:“只要你有 ng-model,就必须在某个地方有一个点。如果你没有一个点,那你就做错了。” Misko 视频@ 29:19
2021-04-23 04:33:41
如何使用 controllerAS 语法应用此解决方案?
2021-05-04 04:33:41
我喜欢这个答案,无需创建不必要的对象。
2021-05-05 04:33:41

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

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

app.controller('ctrlChild',function($scope){
    $scope.$parent.simpleValue = 'y';
});
你是对的,使用 $scope.$parent.value 在大多数情况下都可以工作,但是广泛使用通常不是最好的主意,因为它可能很难在更大、更复杂的项目中进行管理。
2021-05-01 04:33:41

将原始属性分配给作用域时,它始终是作用域的本地属性(可能是动态创建的),即使父作用域具有相同名称的属性。这是一个设计决定,恕我直言,这是一个很好的决定。

如果您需要更改父作用域中的某些原语(整数、布尔值、字符串),从视图中看,您需要它是该作用域中另一个对象的属性,因此赋值可能为:

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

它会反过来:

  1. viewData从它定义的任何范围获取对象
  2. 将 4 分配给它的myAttr属性。

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

在控制器中

$scope.$parent.varaiable_name

在 html 模板中

ng-model="$parent.varaiable_name"