决定我将其制定为答案,因为在评论中我们基本上制定了您想知道的内容:
使用 $http 或 $resource 仍然可以缓存结果,您指出了在您的问题中真正使用一个而不是另一个的原因。如果你有一个 RESTful 接口,那么使用 $resource 会更好,因为你最终会编写更少的样板代码,这对于 RESTful 接口是通用的,如果你不使用 RESTful 服务,那么 $http 更有意义。您可以通过任何一种方式缓存数据http://www.pseudobry.com/power-up-http-with-caching/
我认为将 $http 或 $resource 请求放入服务通常效果更好,因为您希望从多个位置访问数据并且该服务充当单例。所以,基本上你可以处理任何你想做的缓存,并且控制器都可以只观察适当的服务来更新他们自己的数据。我发现控制器中的 $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 团队的关于最佳实践的精彩视频,我仍在重新观看并随着时间的推移慢慢吸收。
http://www.youtube.com/watch?v=ZhfUv0spHCY
特别是关于服务与控制器:
http ://www.youtube.com/watch?v=ZhfUv0spHCY&t=26m41s