【问题标题】:How to modify controller property in parent scope from a child scope?如何从子范围修改父范围中的控制器属性?
【发布时间】:2014-02-18 10:17:28
【问题描述】:

我有一个父控制器来管理 ng-view 中的部分。 它有 5 个选项卡,每个选项卡都有一个表单。 每个表单都有自己的控制器。

我在父范围内维护一个变量。 我想在其中一个子控制器的范围内对其进行修改,以便其他控制器也可以查看更改。

这怎么可能?会像这样的声明 $scope.sharedProperty = 5

将父级中的值设为 5,或者在子范围内创建一个具有该值的新值?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    取决于你在哪里做和输入。如果您使用 string、int、bool 等并在子控制器中进行更改,包括父控制器在内的其他控制器都不会看到它们,因为这将在子控制器上定义一个新属性。

    如果你在父控制器上创建一个对象,比如$scope.sharedObject,那么你可以在子控制器的任何地方操作它,比如

    $scope.sharedObject.prop1="newvalue";

    所有其他人都会看到更改并使用 $scope.$watch 监视它。

    在控制器之间共享数据的更好方法是使用服务。

    还可以在此处阅读 $scope 的原型继承 https://github.com/angular/angular.js/wiki/Understanding-Scopes

    【讨论】:

      【解决方案2】:

      我建议使用作为服务来共享属性,这样可以避免创建依赖项,只需考虑是否需要重用视图而不是作为直接子项而是作为嵌套子项,使用服务角度可以管理让你无后顾之忧。

      例如检查这个answer

      【讨论】:

      • 我也是这么想的,但我想在 HTML 中的 ng-show、ng-disable 指令中使用这些属性,无论如何我都需要范围内的东西。
      • 是的,您的服务将在范围内,因此您将能够访问这些属性,只需在它们前面加上您注入的服务即可。
      • 这样的? $scope.injectedService = 注入服务; $scope.injectedService.property = 5
      • 不需要,只需在定义控制器时将服务添加为依赖项(将注入),然后只需使用 $scope.service.property 而不是 $scope.property。我链接的 SO 问题的批准答案是一个很好的例子。
      【解决方案3】:

      同意@Chandermani 关于服务的看法。但您也可以像这样修改父范围:

      $scope.$parent.sharedProperty = someValue;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-13
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2014-04-21
        相关资源
        最近更新 更多