Подтвердить что ты не робот

Angular $http vs service vs ngResource

Я хотел бы понять преимущества/недостатки использования простого запроса $http на сервер и/или обертывания этого запроса в службе по сравнению с использованием объекта ngResource (кроме очевидного в отношении ресурса RESTful).

Из моего понимания запросы $http являются низкими, но очень гибкими и настраиваемыми, тогда как при работе с RESTful API объекты ngResource делают связь очень простой.

Я предполагаю, что о том, что я спрашиваю, дается очень простой сценарий, скажем, извлечение данных с сервера (запрос GET массива объектов говорит), более эффективно просто использовать запрос $http, а не обертывать его в службе (должно ли это быть всегда так?) или с использованием объекта ngResource?

Любые мысли здесь будут оценены. Например, может быть кэширован ответ $http, может ли ngResource? Спасибо.

4b9b3361

Ответ 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

Ответ 2

Есть одна гораздо более значимая разница, чем то, как можно кэшировать или нет.

Использование ресурса устранит необходимость установки $watches в службе или возвращенных данных. Вам вообще не придется работать с promises. По сути, это устраняет необходимость делать любой из того, что shaunhusain делает выше в своем примере.

Вызов метода ресурса возвращает пустой экземпляр структуры, связанной с этим ресурсом, и вы можете и должны привязываться к нему напрямую. Этот же экземпляр будет заполняться данными позже. Поскольку вы привязаны к экземпляру, когда он заполняется, ваш дисплей будет автоматически обновляться.

Ресурсы могут также предоставлять инкапсулированные средства преобразования запросов и ответов служб, которые он предоставляет, делая все это невидимым для клиента ресурса.

Ресурсы похожи на службы на стероидах.