Ответ 1
Решили, я сформулирую это в ответ, поскольку в комментариях мы разработали в основном то, что вы хотели знать:
Используя $http или $ресурс, результаты все равно могут быть кэшированы, вы указали причины, по которым один из них действительно используется в вашем вопросе. Если у вас есть интерфейс RESTful, то использование $resource лучше, так как вы в конечном итоге напишите меньше кода котельной, который является общим для интерфейса RESTful, если вы не используете RESTful-сервис, тогда больше смысла имеет смысл $http. Вы можете кэшировать данные в любом случае http://www.pseudobry.com/power-up-http-with-caching/
Я думаю, что вложение запросов $http или $ресурсов в службу обычно вообще улучшается, потому что вы хотите иметь доступ к данным из нескольких местоположений, а служба действует как одноэлемент. Таким образом, в основном вы можете обрабатывать любое кэширование, которое вы хотите сделать, и контроллеры могут просто следить за тем, чтобы соответствующие службы обновляли свои собственные данные. Я обнаружил, что комбинация $watch в контроллерах для данных в службе и возврат promises из моих методов обслуживания дает мне максимальную гибкость в том, как обновлять вещи в контроллере.
Я бы поставил что-то вроде этого в моем контроллере, имея примерСервис, введенный в верхней части определения контроллера.
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