从用户定义的$ scope函数内部调用$ resource操作

时间:2013-07-08 21:19:32

标签: ruby-on-rails-3 angularjs

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

问题:每当我从AngJS控制器中的函数内部调用Card.update操作时,我都无法尝试同时记录success和{{ 1}}回复。从函数外部调用error操作时,Card $资源的行为符合预期。

Rails关联

Card.update

Rails路线

Deck has_and_belongs_to_many :cards
Card has_and_belongs_to_many :decks

Rails卡控制器'更新'操作

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

卡片资源工厂

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

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

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'

1 个答案:

答案 0 :(得分:0)

简介

我解决了自己的问题。我使用Misko Hevery的Github comment作为参考。

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

显然,在Angular 1.1.x中,如果您离开角度执行上下文,您将不在Angular的$scope.$apply函数中。就我而言,我正在使用JQuery UI的sortable函数 - 每当Card被放入新的Deck时,我想更新Deck's卡以反映该更新。

据我所知,由于这个原因,我在角度执行上下文之外。 ngResource不会执行PUT语句,并且永远不会调用Angular的$then对象的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