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

时间:2018-03-08 11:07:58

标签: angularjs controller rootscope

我开始在角度开发我不太了解。我想要做的是,我试图将一个相当大的数据集合从一个控制器传递到另一个控制器。这就是我设法做到的方式。

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

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

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

(这是一个包含5k字符串的数组)

然后在另一个控制器中捕获。其他开发人员表示通过$ rootScope传递此信息是不安全的,但是在传递数据并将其复制到本地控制器之后,我使用它来删除rootScope中的集合

delete $rootScope.selectedItems;

这是一种安全的方法吗?它完美无缺,对我来说似乎没什么危险

2 个答案:

答案 0 :(得分:0)

您可以使用广播提供许多服务

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

答案 1 :(得分:0)

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

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