在不同控制器之间共享数据的最佳角度方式
我有一个表单数据,我需要在实际提交之前在不同控制器之间共享。在不同控制器之间共享数据的最佳角度方式
我正在使用module.value()将数据保存为全局数据。
var serviceApp = angular.module('sampleservice', [ ]);
serviceApp.value('GData',{});
我想知道这是最好的解决方案吗?
您应该使用而不是为此目的使用模块。最好的选择是使用service
,因为它用于在控制器之间共享持久数据。
var ControllerOne = function (someService) {
}
var ControllerTwo = function (someService) {
}
app.service('someService', function(){
this.sayHello= function(text){
return "Service says \"Hello " + text + "\"";
};
});
或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]);
感谢您的答复,我的疑问是为什么我们需要一个服务和变量/属性,我们不能使用module.value(),我们可以直接注入到控制器? –
模块不是为此目的。服务是共享数据的标准。在这里阅读更多关于模块http://docs.angularjs.org/guide/module。角度文档清楚地表明了这一点。 –
Value()*是一种服务类型(http://docs.angularjs.org/api/AUTO.$provide)。 –
如图所示,一种方法使用event
,如图这篇文章:http://www.objectpartners.com/2013/08/21/using-services-and-messages-to-share-data-between-controllers-in-angularjs/ 是保持在服务中的数据,并让每个控制器得到变更通知。
这意味着每个控制器可能都有自己的$范围内的数据副本,以便他们的视图可以访问它。此外,您需要在服务中的$ rootScope和每个控制器上的$ on上调用$ broadcast,以确保数据保持同步。
我更喜欢的另一种方法是避免使用$ rootScope进行广播,只需将数据保存在“应用”控制器中并让视图直接指向它,$ on就可以保持数据同步。该视图仍然通过控制器的范围获取数据,但通过继承。您不必$广播或$开,因为没有什么可以保持同步,并且服务是真正的无状态。服务获取数据的方式是将应用程序控制器作用域中的对象传递给它的方法。
我分叉从我提到的文章和修改来演示这种技术。我想你会发现生成的代码更小,更易于理解。无论如何,这对我来说都是。我确实意识到这是一个偏好问题。
为什么不把父母控制器,两个控制器和“玩”的范围继承? – Mik378
[可以一个控制器在AngularJS中调用另一个控制器的可能的副本](http://stackoverflow.com/questions/9293423/can-one-controller-call-another-in-angularjs) – Stewie