【问题标题】:Angular $resource always calls success callbackAngular $resource 总是调用成功回调
【发布时间】:2015-01-10 13:05:01
【问题描述】:

我对 Angular $resource 有疑问。我将它与启用了 CORS 的 API 服务器一起使用。

无论服务器返回什么错误代码(尝试过 500、422、409)资源总是调用成功回调。

控制器中的动作:

@SpacePostsService.save { spaceId: @space._id }, @post, @_createSuccess, (errors)=>¬
  @_createError(errors, form)

SpacePostsService 在哪里:

SpacePostsService = $resource postsUrl, {},¬
  query:¬
    isArray: true¬
    method: 'GET'¬
    responseType: 'json'¬
    transformResponse: (data, headers)->¬
      results = data.results || data¬
      results = [results] unless _.isArray(results)¬
      results

有人知道我做错了什么吗?

PS。为了便于阅读,我没有展示所有代码,SpacePostService 是一个工厂,它被正确地注入到控制器中。

【问题讨论】:

  • 要保存的方法签名是什么样的?
  • 你试过$save吗?另外,如何将SpacePostsService 放入控制器类?某种注射?因为你似乎没有得到一些undefined doesn't have a method save,所以它似乎是正确的$resource。我只是猜测,但也许你进入了“实例动作”部分。那么你应该使用….$save { spaceId: @space._id }, @_createSuccess, (errors)=>¬ @_createError(errors, form)
  • @PatrickJ.S.我已经更新了这个问题。我不能使用实例方法,因为我也需要发送帖子参数。 Post 不是资源,它只是一个简单的对象。
  • 嗯。您是否尝试过访问$promise 对象?从那里你可以检查响应的标题,也许某处出了问题。
  • @PatrickJ.S.我尝试访问 $promise 但它没有帮助 - 它仍然会成功回调。

标签: javascript angularjs coffeescript


【解决方案1】:

我终于找到了问题所在。原来我在其他地方定义了全局拦截器:

AjaxInProgress =
  request: (config)->
    $rootScope.$broadcast 'ajax:in-progress'
    config
  response: (response)->
    $rootScope.$broadcast 'ajax:finished'
    response
  responseError: (response)->
    $rootScope.$broadcast 'ajax:finished'
    return response

responseError 方法的最后一行是最重要的——因为我没有拒绝承诺,所以 Angular 认为我从错误中恢复,它在 $resource 函数中调用了成功回调。我将 AjaxInProgress 中的最后一行更改为:

responseError: (response)->
    $rootScope.$broadcast 'ajax:finished'
    $q.reject(response)

它解决了问题。

谢谢你们的帮助。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多