0

前端: AngularJS 1.1.5ngResource返回一个承诺的$then功能
后端: Rails 3.2

问题:每当我Card.update从 AngJS 控制器中的函数内部调用操作时,尝试同时记录success和响应都没有得到error响应。从函数外部调用操作时,Card$resource 的行为与预期的一样。Card.update

铁路协会

Deck has_and_belongs_to_many :cards
Card has_and_belongs_to_many :decks

铁路路线

resources :cards do
  get '/decks' => 'cards#decks', on: :member
end

Rails 卡控制器“更新”操作

def update
  @card = Card.where( id: params[:id] ).first

  unless params[:deck_id].nil?
    @deck = Deck.where( id: params[:deck_id] ).first

    @deck.cards << @card
  end

  render json: Card.update( params[:id], params[:card] )
end

卡牌资源厂

app.factory "Card", ($resource) ->
  $resource "/cards/:id",
    id: "@id"
  ,
    index:
      method: "GET"
      isArray: true

    show:
      method: "GET"
      isArray: false

    create:
      method: "POST"

    update:
      method: "PUT"

    destroy:
      method: "DELETE"

    decks:
      method: "GET"
      isArray: true
      url: 'cards/:id/decks'

卡片更新功能(在 AngJS 控制器内部):(成功/错误消息不会记录到控制台)。

$scope.updateCard = ( card_id, old_deck, new_deck ) ->
  console.log 'CardCtrl updateCard function'
  card_id = parseInt(card_id)
  old_deck = parseInt(old_deck)
  new_deck = parseInt(new_deck)

  Card.update( id: card_id, deck_id: new_deck ).$then (success, error) ->
    console.log 'Success'
    console.log success

    console.log 'Error'
    console.log error
4

1 回答 1

0

介绍

我解决了我自己的问题。我使用Misko Hevery 的这个Github 评论作为参考。

为什么我的 PUT 请求没有执行:

显然,Angular 1.1.x如果您离开Angular执行上下文,您将超出 Angular 的$scope.$apply功能。就我而言,我正在使用 JQuery UI 的sortable功能 - 每当 aCard被放入 newDeck时,我都想更新Deck's卡片以反映该更新。

据我所知,正因为如此,我在angular execution context之外。ngResource不会执行该PUT语句,并且永远不会调用$thenAngular 对象的函数。promise

解决方案:

简单地将$scope.$apply函数包裹在Card.update动作周围就可以执行动作,从而允许$then函数执行。请参阅下面的代码示例以获得进一步说明:

$scope.$apply ->
  Card.update(
    id: 1
    deck_id: 2
    front: "HELLO WORLD!"
  ).$then ((success) ->
    console.log "Success"
    console.log success
  ), (error) ->
    console.log "Error"
    console.log error
于 2013-07-10T00:36:46.983 回答