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