programing

각 $http vs 서비스 vs ng Resource

stoneblock 2023. 3. 5. 09:26

각 $http vs 서비스 vs ng Resource

서버에 대한 단순한 $http 요청을 사용하거나 해당 요청을 서비스로 래핑하는 것과 ngResource 개체를 사용하는 것의 장점과 단점을 이해하고 싶습니다(RESTful 리소스에 관한 명백한 것 이외).

제가 이해하기로는 $http 요청은 낮은 수준이지만 매우 유연하고 설정이 가능한 반면 RESTful API를 다룰 때 ngResource 객체는 매우 간단한 통신을 제공합니다.

제가 문의하는 것은 매우 간단한 시나리오입니다.예를 들어 서버로부터의 데이터 취득(객체 배열의 GET 요구라고 합니다)은 $http 요구를 서비스로 래핑(항상 그래야 합니까?)하거나 ngResource 개체를 사용하는 것보다 단순하게 사용하는 것이 효율적입니다.

어떤 의견이라도 주시면 감사하겠습니다.예를 들어 $http 응답을 캐시할 수 있습니다.ngResource는 캐시할 수 있습니까?감사해요.

코멘트에서 기본적으로 여러분이 알고 싶어하는 것을 파악했기 때문에, 이것을 답변으로 정리하기로 결정했습니다.

$http 또는 $resources를 사용하여 결과를 캐시할 수 있습니다. 질문에서 하나를 다른 하나보다 더 사용해야 하는 이유를 지적했습니다.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

캐시 가능 여부보다 훨씬 더 의미 있는 차이가 하나 있습니다.

리소스를 사용하면 서비스 또는 반환된 데이터에 $watch를 설정할 필요가 없어집니다.당신은 약속을 가지고 일하지 않아도 될 것입니다.본질적으로, 그것은 그의 예에서 숀후신이 하고 있는 어떤 것도 할 필요가 없다.

리소스 메서드를 호출하면 해당 리소스와 관련된 구조의 빈 인스턴스가 반환되므로 직접 바인딩할 수 있습니다.이 동일한 인스턴스는 나중에 데이터로 채워집니다.인스턴스에 바인딩되어 있기 때문에 인스턴스가 채워지면 디스플레이가 자동으로 업데이트됩니다.

리소스는 또한 제공하는 서비스의 요청 및 응답을 캡슐화된 방식으로 변환하여 리소스 클라이언트에 모두 표시되지 않게 할 수도 있습니다.

자원은 스테로이드제의 서비스와 같다.

언급URL : https://stackoverflow.com/questions/17667455/angular-http-vs-service-vs-ngresource