Javascript 在不同控制器之间共享数据的最佳方式

Javascript 在不同控制器之间共享数据的最佳方式,javascript,angularjs,Javascript,Angularjs,在实际提交之前,我需要在不同的控制器之间共享表单数据 我使用module.value()将数据保存为全局数据 var serviceApp = angular.module('sampleservice', [ ]); serviceApp.value('GData',{}); 我想知道这是最好的解决方案吗?您应该不要为此使用模块。最好的选择是使用服务,因为它用于在控制器之间共享持久数据 var ControllerOne = function (someService) { }

在实际提交之前,我需要在不同的控制器之间共享表单数据

我使用module.value()将数据保存为全局数据

  var serviceApp = angular.module('sampleservice', [ ]);

   serviceApp.value('GData',{});
我想知道这是最好的解决方案吗?

您应该不要为此使用模块。最好的选择是使用
服务
,因为它用于在控制器之间共享持久数据

var ControllerOne = function (someService) {

}

var ControllerTwo = function (someService) {

}

app.service('someService', function(){
    this.sayHello= function(text){
        return "Service says \"Hello " + text + "\"";
    };            
});
或者在
范围上使用
事件

var ControllerOne = function($scope) {
  $scope.$on('someEvent', function(event, data) {

  });
}

var ControllerTwo = function($scope) {
  $scope.$on('someEvent', function(event, data) {

  });
}

$rootScope.$broadcast('someEvent', [1,2,3]);

如前所述,本文给出了一种方法: 是将数据保存在服务中,并让每个控制器收到更改通知

这意味着每个控制器都可能在其$scope中有自己的数据副本,以便其视图可以访问它。此外,您需要在服务中的$rootScope上调用$broadcast,在每个控制器中调用$on,以确保数据保持同步

我更喜欢的另一种方法是避免使用$rootScope进行广播,而$on则通过简单地将数据保存在“应用程序”控制器中并让您的视图直接指向它来保持数据同步。视图仍然通过控制器的作用域获取数据,但是通过继承。您不需要$broadcast或$on,因为没有任何东西可以保持同步,而且该服务确实是无状态的。服务获取数据的方式是将应用程序控制器作用域中的对象传递给其方法

我从我提到的文章中派生出了plunk,并对其进行了修改以演示这种技术。我想您会发现生成的代码更小,更容易理解。不管怎样,这对我来说很重要。我确实意识到这是一个偏好的问题


为什么不为控制器和作用域继承创建一个父控制器并“播放”?可能重复感谢您的回答,我的疑问是,为什么我们需要一个服务和其中的变量/属性,我们不能使用module.value(),我们可以将其直接注入控制器?模块不用于此目的。服务是共享数据的标准。阅读更多关于模块的信息。角度文档清楚地说明了这一点。