41

我想了解对服务器使用简单的 $http 请求和/或将该请求包装在服务中与使用 ngResource 对象相比的优点/缺点(除了关于 RESTful 资源的明显内容)。

据我了解,$http 请求是低级的,但非常灵活且可配置,而在处理 RESTful API 时,ngResource 对象使通信非常简单。

我想我要查询的是一个非常简单的场景,比如从服务器检索数据(对象数组的 GET 请求说)简单地使用 $http 请求而不是将其包装在服务中更有效(应该总是这样吗?)还是使用 ngResource 对象?

这里的任何想法将不胜感激。例如,一个 $http 响应可以被缓存,一个 ngResource 可以吗?谢谢。

4

2 回答 2

42

决定我将其制定为答案,因为在评论中我们基本上制定了您想知道的内容:

使用 $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){
                    //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

于 2013-07-16T05:15:49.810 回答
5

与它们是否可以缓存相比,还有一个更有意义的区别。

使用资源将无需在服务或返回的数据上设置 $watches。您也不必使用 Promise。从本质上讲,它消除了执行上述示例中 shaunhusain 所做的任何事情的需要。

对资源方法的调用会返回与该资源关联的结构的空实例,您可以并且应该直接绑定到它。这个相同的实例将在稍后的某个时间填充数据。由于您已绑定到实例,当它填充时,您的显示将自动更新。

资源还可以提供一种封装的方法来转换它所提供的服务的请求和响应,从而使资源的客户端完全不可见。

资源就像类固醇上的服务。

于 2014-07-20T16:31:12.623 回答