在实际提交之前,我有一个表单数据需要在不同的控制器之间共享。
我正在使用 module.value() 将数据保存为全局。
var serviceApp = angular.module('sampleservice', [ ]);
serviceApp.value('GData',{});
我想知道这是最好的解决方案吗?
在实际提交之前,我有一个表单数据需要在不同的控制器之间共享。
我正在使用 module.value() 将数据保存为全局。
var serviceApp = angular.module('sampleservice', [ ]);
serviceApp.value('GData',{});
我想知道这是最好的解决方案吗?
您不应该为此目的使用模块。最好的选择是使用 a service
,因为它用于在 Controller 之间共享持久数据。
var ControllerOne = function (someService) {
}
var ControllerTwo = function (someService) {
}
app.service('someService', function(){
this.sayHello= function(text){
return "Service says \"Hello " + text + "\"";
};
});
或event
使用scope
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]);
如前所述,一种方法,如本文所示:http ://www.objectpartners.com/2013/08/21/using-services-and-messages-to-share-data-between-controllers-in-angularjs/ 是将数据保存在服务中,并让每个控制器收到更改通知。
这意味着每个控制器都可能在其 $scope 中拥有自己的数据副本,以便他们的视图可以访问它。此外,您需要在服务中的 $rootScope 上调用 $broadcast,并在每个控制器中调用 $on 以确保数据保持同步。
我更喜欢的另一种方法是避免使用 $rootScope 进行广播,并通过简单地将数据保存在“应用程序”控制器中并让您的视图直接指向它来保持数据同步。视图仍然通过控制器的范围获取数据,但通过继承。您不必 $broadcast 或 $on 因为没有什么要保持同步,而且该服务是真正无状态的。服务获取数据的方式是将应用控制器范围内的对象传递给它的方法。
我从我提到的文章中分出了 plunk,并对其进行了修改以演示这种技术。我想你会发现生成的代码更小更容易理解。无论如何,这对我来说。我确实意识到其中一些是偏好问题。