Angular $ http vs service vs ngResource
我想了解使用简单的$ http请求到服务器和/或在服务中使用ngResource对象(除了关于RESTful资源的显而易见)包装该请求的优点/缺点。
根据我的理解,$ http请求是低级的,但是非常灵活和可configuration,而在处理RESTful API时,ngResource对象使得通信非常简单。
我想我正在查询的是一个非常简单的场景,比如说从服务器中获取数据(对象数组的GET请求)只是简单地使用$ http请求而不是将其包装在一个服务中(应该总是这样吗?)或使用ngResource对象?
任何想法在这里将不胜感激。 例如,一个$ http响应可以被caching,一个ngResource可以吗? 谢谢。
决定我会制定这个答案,因为在我们的基本上你想知道的意见:
使用$ http或$ resource的结果仍然可以caching,你指出了在你的问题中真正使用一个的原因。 如果你有一个REST风格的接口,那么使用$ resource会更好,因为如果你不使用REST风格的服务,那么最终你会写出一些REST风格的接口不常见的锅炉代码,那么$ http更有意义。 您可以caching数据http://www.pseudobry.com/power-up-http-with-caching/
我认为把$ http或者$ resource请求放到一个服务中通常会更好,因为你想要访问来自多个位置的数据,并且这个服务作为一个单例。 所以,基本上你可以处理任何想要在那里做的caching,控制器都可以只是看适当的服务来更新他们自己的数据。 我发现在服务器上的数据组合中监控$ watch,并从服务的方法中返回承诺给了我如何更新控制器中的东西的最大灵活性。
我把这样的事情放在控制器定义的顶部注入exampleService的控制器中。
angular.module("exampleApp", []).service('exampleService', ["$http", "$q" ,function ($http, $q) { var service = { returnedData: [], dataLoaded:{}, getData = function(forceRefresh) { var deferred = $q.defer(); if(!service.dataLoaded.genericData || forceRefresh) { $http.get("php/getSomeData.php").success(function(data){ //service.returnedData = data; //As Mark mentions in the comments below the line above could be replaced by angular.copy(data, service.returnedData); //if the intention of the watch is just to update the data //in which case the watch is unnecessary and data can //be passed directly from the service to the controller service.dataLoaded.genericData = true; deferred.resolve(service.returnedData); }); } else { deferred.resolve(service.returnedData); } return deferred.promise; }, addSomeData:function(someDataToAdd) { $http.post("php/addSomeData.php", someDataToAdd).success(function(data){ service.getData(true); }); } }; service.getData(); return service; }]).controller("ExampleCtrl", ["$scope", "exampleService", function($scope, exampleService){ //$scope.$watch(function() {return exampleService.returnedData}, function(returnedData){ // $scope.myModel.someData = returnedData; //}); //if not using angular.copy() in service just use watch above $scope.myModel.someData = exampleService.returnedData; }]);
这里还有一个来自Angular团队的最佳实践的一个很好的video,我仍然在重新观察并慢慢吸收。
http://www.youtube.com/watch?v=ZhfUv0spHCY
特别是在服务与控制器上: http : //www.youtube.com/watch?v = ZhfUv0spHCY&t = 26m41s
有一个比它们是否可以被caching更有意义的区别。
使用资源将不需要在服务或返回的数据上设置$ watch。 你根本不需要承诺。 从本质上讲,它消除了做他的例子中shaunhusain所做的任何事情的必要性。
对资源方法的调用返回与该资源关联的结构的空实例,您可以并且应该直接绑定到该实例。 这个相同的实例将在稍后填充数据。 既然你已经绑定到实例,当它填充时,你的显示将自动更新。
资源也可以提供一种封装的方式来转换它提供的服务的请求和响应,使得资源的客户端看不到这些资源。
资源就像是类固醇的服务。