Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度$http vs服务vs ngResource_Angularjs - Fatal编程技术网

Angularjs 角度$http vs服务vs ngResource

Angularjs 角度$http vs服务vs ngResource,angularjs,Angularjs,我想了解对服务器使用简单的$http请求和/或将该请求包装到服务中与使用ngResource对象相比的优势/劣势(除了关于RESTful资源的明显优势) 据我所知,$http请求级别较低,但非常灵活且可配置,而在处理RESTful API时,ngResource对象使通信非常简单 我想我要问的是一个非常简单的场景,比如从服务器检索数据(比如获取对象数组的请求),简单地使用$http请求是否比将其包装在服务中(应该总是这样吗?)或使用ngResource对象更有效 如果您有任何想法,我们将不胜感激

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

据我所知,$http请求级别较低,但非常灵活且可配置,而在处理RESTful API时,ngResource对象使通信非常简单

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


如果您有任何想法,我们将不胜感激。例如,可以缓存$http响应,ngResource是否可以?谢谢。

我决定将此表述为一个答案,因为在评论中,我们基本上解决了您想知道的问题:

使用$http或$resource仍然可以缓存结果,您在问题中指出了使用其中一个的原因。如果您有一个RESTful接口,那么使用$resource会更好,因为您最终会编写更少的RESTful接口通用的锅炉板代码,如果您不使用RESTful服务,那么$http更有意义。您可以通过任何一种方式缓存数据

我认为,将$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团队的关于最佳实践的精彩视频,我仍在继续观看并慢慢吸收

特别是在服务与控制器方面:
有一个比它们是否可以缓存更有意义的区别

使用资源将不再需要在服务或返回的数据上设置$watchs。你也不必带着承诺工作。本质上,它消除了shaunhusain在其示例中所做的任何事情

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

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


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

两者都可以缓存,您在问题中指出了使用其中一种的原因。如果您有一个RESTful接口,那么使用$resource会更好,因为您最终会编写更少的RESTful接口通用的锅炉板代码,如果您不使用RESTful服务,那么$http更有意义。如果这回答了您的问题,您可以通过任何一种方式缓存数据。请让我知道,我会将其作为答案发布并删除评论。感谢您的回复,我想是这样的,我只是想知道$http与ngResource相比有何优势,特别是在上面提到的附带情况下,您仍然返回对象,可能来自RESTful API,但除了GET之外不需要进一步的交互。也许我读了很多,只是找不到讨论过的用例,只有实现。还有一些讨论建议将$http请求包装在服务中,但没有找到明确的最佳实践。我认为将$http请求放入服务通常效果更好,因为您希望从多个位置访问数据,并且服务作为一个单例,因此基本上您可以处理任何类型的请求如果您想在那里进行缓存,那么控制器都可以监视相应的服务来更新自己的数据。我发现控制器中的$watch组合用于获取服务上的数据,并从我的服务方法返回承诺,使我能够最灵活地更新控制器中的内容。这很有意义,回答很好,谢谢!没问题,很高兴这是有意义的,真的看我下面链接的视频,虽然它非常宝贵。+1。如果在服务中使用
angular.copy(数据、服务、返回数据)
,则可以消除控制器中的
$watch
。这样,您将更新相同的数组,而不是分配一个新数组。对于正在工作的plunker,请参见刚刚注意到的答案。在这方面我有很多不同意见。如果您只是使用angular.copy替换对象的内容而不是对象本身,则$watchs在任何情况下都是一个没有意义的点。服务允许您定义一个可注入的对象,它是一个单例对象,我并不认为它是什么。$resource只是$http之上的一个抽象,用于处理最终使用$http反复重写的RESTful内容。承诺公开了请求的异步性质,也可以通过资源上的$PROMITE获得(这是一件好事)。在某些情况下,我会从服务器收到各种错误-输入错误或与表单字段或一般业务错误相关的业务验证错误,或“此记录已被其他人编辑,请重新加载”,或用户会话因不活动或意外的服务器错误而过期。其中一些错误