【问题标题】:How to add call back for $resource methods in AngularJS如何在 AngularJS 中为 $resource 方法添加回调
【发布时间】:2012-11-30 21:44:32
【问题描述】:

通常情况下,我们需要在用户更新/创建一些数据后向用户显示错误/成功消息,我们如何在 AngularJS 中实现它?
我想添加回调但找不到解决方案。使用 $http.post().success().error() 有效,但我想知道我是否可以使用更高级别的 API $resource 来做到这一点。
或者,我们应该编写指令或使用 $watch()?
提前感谢您的帮助。

【问题讨论】:

    标签: resources callback angularjs


    【解决方案1】:

    Resource 类中的操作可以像较低级别的 $http 服务一样传递成功和错误回调

    From the docs

    • HTTP GET“类”操作:Resource.action([parameters], [success], [error])
    • 非 GET “类”操作:Resource.action([parameters], postData, [success], [error])

    非获取操作以$ 为前缀。

    所以你可以这样做

    User.get({userId:123}, function(u, getResponseHeaders){
      // this is get's success callback
      u.abc = true;
      u.$save(function(u, putResponseHeaders) {
        // This is $save's success callback, invoke notification from here
      });
    });
    

    编辑:这里是another example from a previous plunker。 get 请求将失败,因为它请求一个不存在的 json 文件。将运行错误回调。

    someResource.get(function(data){
        console.log('success, got data: ', data);       
    }, function(err){
        alert('request failed');
    });
    

    【讨论】:

    • 非常感谢!进一步的问题是如何将数据包装成表单数据? this post 中的解决方案似乎不适用于资源方法(可用于 $http.put)。谢谢
    • comment = Comment.save($scope.newComment, (response) -> console.log("Commentmitted.")) ...也可以。
    • 非获取操作的格式是 Resource.action([parameters], postData, [success], [error]) .. 但在你的例子中它是不同的 u.$save(function( u, putResponseHeaders) {...........
    【解决方案2】:

    对于最新的 AngularJS 版本,您可以查看 $interceptors,它们是 $httpProvider 的一部分。

    然后您可以在发送之前或响应之后拦截所有请求。

    angular.module('app').config(function($httpProvider){
    
      $httpProvider.interceptors.push(function($q) {
        return {
          'request': function(config) {
            console.log('I will send a request to the server');
            return config; 
          },
    
          'response': function(response) {
            // called if HTTP CODE = 2xx 
            console.log('I got a sucessfull response from server'); 
            return response;
          }
    
          'responseError': function(rejection) {
            // called if HTTP CODE != 2xx
            console.log('I got an error from server');
            return $q.reject(rejection);
          }
        };
      });
    
    });
    

    请注意,您必须返回 configresponse 才能使其正常工作。

    对于rejection,您需要返回延迟拒绝,以使$http.get().error() 在拦截后仍然有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多