【问题标题】:Passing data from one controller through another through $rootScope通过 $rootScope 从一个控制器通过另一个控制器传递数据
【发布时间】:2026-02-14 15:55:01
【问题描述】:

我正在开始我的 Angular 开发,但我知道的不多。我想要做的是我试图将相当大的数据集合从一个控制器传递到另一个控制器。这就是我设法做到的方式。

angular.module("myApp").controller("controllerName", function($rootScope, $scope, *...other stuff...*) 
{ /* code */ }

后来有一个特定的方法可以从外部访问,我像这样复制集合:

$rootScope.selectedItems = angular.copy($scope.selected.items);

(这是一个由 5k 个字符串组成的数组)

然后在另一个控制器中捕获。其他开发人员说通过 $rootScope 传递它是不安全的,但是在数据传递并复制到本地控制器之后,我用它来摆脱 rootScope 中的集合

delete $rootScope.selectedItems;

这是一种安全的方法吗?它工作得很好,对我来说似乎没有什么危险

【问题讨论】:

  • 您的问题中有angularangularjs 标签。它们通常是互斥的:angularjs 用于 1.x 版本,angular 用于所有其他版本。由于回复可能取决于版本,因此您可能需要指定您正在使用的实际版本。

标签: angularjs controller rootscope


【解决方案1】:

一般来说,不要使用$rootScope 来传递数据。通过使用它,您可以使您的模块依赖于未指定的功能,这可能不是您的模块的依赖项。这是一个结构性问题,以后会产生问题。

改为使用服务:

angular.module("myApp").service("myAppService", function () {
    this.selectedItems = [];
});

angular.module("myApp").controller("controllerName1", function(myAppService, $scope) {
    $scope.selectedItems = myAppService.selectedItems;
});

angular.module("myApp").controller("controllerName2", function(myAppService, $scope) {
    $scope.selectedItems = myAppService.selectedItems;
});

还建议您将所有逻辑都放入服务(以及适当的工厂/提供者)中。控制器应该用于公开服务功能,除非可以证明必要的特殊情况。这使得服务中的逻辑更容易进行单元测试。

【讨论】:

    【解决方案2】:

    有很多服务可用,你应该和广播一起去

    这是 $broadcast 服务的示例 https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

    【讨论】:

      最近更新 更多