AngularJS $http vs service vs ngResource

5cg8jx4n  于 2023-05-05  发布在  Angular
关注(0)|答案(2)|浏览(119)

我想了解使用简单的$http请求到服务器和/或将该请求 Package 在服务中与使用ngResource对象(除了关于RESTful资源的明显优点)的优点和缺点。
根据我的理解,$http请求是低级的,但非常灵活和可配置,而在处理RESTful API时,ngResource对象使通信非常简单。
我想我所询问的是一个非常简单的场景,比如从服务器检索数据(比如对象数组的GET请求),简单地使用$http请求是否比将其 Package 在服务中更有效(应该总是这样吗?))或使用ngResource对象?
这里的任何想法将不胜感激。例如,$http响应可以缓存,但ngResource可以吗?

wpx232ag

wpx232ag1#

决定我将把这个公式化为一个答案,因为在评论中,我们基本上解决了你想知道的问题:
使用$http或$resource仍然可以缓存结果,您在问题中指出了使用其中一个的原因。如果你有一个RESTful接口,那么使用$resource更好,因为你最终会编写更少的样板代码,这是RESTful接口所共有的,如果你没有使用RESTful服务,那么$http更有意义。您可以以任意方式缓存数据http://www.pseudobry.com/power-up-http-with-caching/
我认为把$http或$resource请求放到一个服务中通常效果更好,因为你希望从多个位置访问数据,而服务作为一个单体。所以,基本上你可以在那里处理任何类型的缓存,控制器都可以监视适当的服务来更新自己的数据。我发现在服务的数据控制器中使用$watch和从我的服务的方法返回promise的组合,在如何更新控制器中的内容方面给了我最大的灵活性。
我会在我的控制器中放置类似的东西,在控制器定义的顶部注入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

zf2sa74q

zf2sa74q2#

有一个比它们是否可以被缓存更有意义的区别。
使用资源将消除在服务或返回的数据上设置$watches的需要。你也不必与承诺一起工作。从本质上讲,它消除了做任何shaunhusain在他的例子中上面正在做的事情的需要。
对资源方法的调用将返回与该资源关联的结构的空示例,您可以也应该直接绑定到该示例。同一个示例将在稍后的某个时间填充数据。由于您已绑定到示例,因此当它填充时,您的显示将自动更新。
资源还可以提供一种封装的方法来转换它所提供的服务的请求和响应,使其对资源的客户端不可见。
资源就像打了类固醇的服务。

相关问题