我决定将这个问题转化为一个答案,因为在评论中我们已经基本弄清楚了你想知道的内容:
使用$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){
angular.copy(data, service.returnedData);
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.myModel.someData = exampleService.returnedData;
}]);
这里还有一个来自Angular团队的关于最佳实践的不错视频,我现在还在反复观看并逐渐吸收其中的内容。
http://www.youtube.com/watch?v=ZhfUv0spHCY
具体来讲是关于服务(services)和控制器(controllers)的区别:
http://www.youtube.com/watch?v=ZhfUv0spHCY&t=26m41s