通过 $rootScope 将数据从一个控制器传递到另一个控制器

Passing data from one controller through another through $rootScope

我在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;

这样做安全吗?它工作得很好,对我来说似乎没有什么危险

有很多服务可用,您应该选择广播

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

作为一般规则,不要使用 $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;
});

还建议将所有逻辑都放入服务中(并且 factories/providers 在适当的地方)。除非可以证明必要的特殊情况,否则控制器应 用于公开服务功能。这使得服务中的逻辑更容易进行单元测试。