0

collection.create(model) で動作するように wait: true オプションを取得しようとしていますが、運がありません。

追加時にレンダリングされるビュー

window.ObjectsView = GreyboxView.extend
  initialize: function() {
    _.bindAll(this, 'render');
    this.collection.bind('add', this.render);
    return this.collection.bind('reset', this.render);
  },
  render: function() {
    json = { obj removed }
    this.template = _.template(JST['irboards/index'](json));
    this.$el.html(this.template());
    this.renderObjects();
    return this;
  }
}

モデル保存について (新規)

window.FormView = GreyboxView.extend({
  // un-needed code omitted
  saveModel: function() {
    this.model.set { all my attributes }

    this.collection.create(this.model, {
      wait: true
    });
  }
}

レールコントローラーで:

def create
  @model = Model.new(params[:model].merge({:account_id => current_user.account.id, :action_user_id => current_user.id}))

  if @model.save
    flash[:success] = AppSystem::Notifications.created('Model')
    respond_with @model.to_json
  else
    flash[:error] = @model.errors[:base].blank? ? AppSystem::Notifications::FORM_ERROR :   @model.errors[:base]
    render :action => :new
  end
end

基本的に {wait: true} は何もしません... js モデルがコレクションに追加されていないか、b/c がデータベースに保存されているか、

this.collection.bind('add', this.render)

がトリガーされていないか、レールが成功を返していない可能性があります...よくわかりません。

誰でも助けることができますか?

前もって感謝します


どうやら自分の質問にはまだ答えられないようですが、この b/c を忘れたくありません。他の人の助けになることはわかっています。それで:

うーん...長い間検索し、最終的にこの質問を投稿した後...これを処理する方法を発見しました。この投稿/ブログを見つけました

http://italktoomuch.com/2012/05/setting-up-backbonejs-with-ruby-on-rails/

基本的に私の create :action は

def create
  respond_with = Model.create(params0
end

jsは次のとおりです。

this.collection.create(attributes, {
  wait: false,
  success: function() {
    return _this.collection.trigger('reset');
  },
  error: function() {
    return alert('wrong!');
  }
})

それで、待っても何も起こらないと信じるしかありませんか?または私はそれを間違って使用していますか?わかりませんが、これは機能しており、満足しています。もう少しリファクタリングを行う必要がありますが、これは開始するのに適した場所です

これが他の人にも役立つことを願っています

4

1 に答える 1

1

{wait:true}確かに何かをします!:-)

Railsについては何も知りませんが、ここに問題があると思います。基本的に、オプションを渡すと、wait:trueバックボーンはモデルを作成または破棄する前にサーバーの応答を待機するため、リソースが保存または削除されたことが確認された後にのみコレクションに追加または削除されます。

したがって、使用する上で重要なコンポーネントwait:trueは、サーバーの応答に適切な HTTP ステータスが含まれていることを確認することです。OKAY の場合は 200 のステータスを返し、そうでない場合は 400 または 500 などを返します。選んでください。あなたのコードがこれを行うかどうかはよくわかりませんが、確認する必要があります。

さらに注意すると、成功とエラーのコールバックをコードに追加したようです。基本的にこれは、バックボーンが成功またはエラーを呼び出すかどうかを知る方法でもあります。200と成功を実行します。それ以外の場合、エラーが発生します。

デフォルトでは (現在) Backbone は楽観的です。つまり、何も渡さない (またはwait:false) 場合、Backbone はすべてがうまくいくと想定します。したがって、サーバーからの応答を取得する前に、追加または破棄イベントがトリガーされます。

于 2012-08-17T18:30:09.903 に答える