2012-04-03 1 views
10

Rails 3.2.2でバックボーンjs 0.9.2を実行しています。コストローを追加するページがあります。コストにはタイトル、説明、価格の3つのTextFieldがあります。Ajaxキューバックボーンjs

私は各コストをぼかしに保存しています。

model.save()は、非常に短い間隔で複数回呼び出されます。どちらか1つcreate(post)を要求し、その後にはupdate(put)の要求があります。私が経験している問題は、PUT要求がPOSTの前にサーバーに到達することがあり、その結果、モデルが作成され、2回持続されるということです。

ぼかしを保存するには要求された動作ですので、要求をキューに入れる方法が必要です。 私はSpine jsについて何かを読んだことがあり、何らかのキューで解決しています。私もthisを見てきましたが、これを理解できないようです。

"single-page-apps"で作業しているが、何も見つかりませんでした。

答えて

9

保存方法をオーバーライドして、deferred objectのキューを作成できます。例えば、

var MDef = Backbone.Model.extend({ 
    url: "/echo/json/?delay=3", 

    initialize: function() { 
     this.queue = $.Deferred(); 
     this.queue.resolve(); 
    }, 

    save: function(attrs,options) { 
     var m = this; 
     console.log("set "+JSON.stringify(attrs)); 

     // this.queue = this.queue.pipe with jquery<1.8 
     this.queue = this.queue.then(function() { 
      console.log("request "+JSON.stringify(attrs)); 
      return Backbone.Model.prototype.save.call(m, attrs, options); 
     });    
    } 
}); 

var m = new MDef(); 
m.save({title: "a title"}); 
m.save({description: "a description"}); 
m.save({price: "a price"}); 

とフィドル:http://jsfiddle.net/nikoshr/8nEUm/

+0

これを素晴らしい結果とともに使用して、ありがとうございます! –

3

ユーザdebounceunderscore.js

待機ミリ秒は、それが呼び出された最後の時間から経過した後まで、その実行を延期する渡された関数の新しいデバウンスバージョンを作成し、返します。

この方法では、最後のblurイベントの後に1回だけ発生します。

+2

防弾ソリューションではありません、それはほとんどのケースを解決することがありますが、データが失われる可能性が可能性がまだあります。 –

+0

@TimBrunsmo、@abraham 'debounce'が正しいです。データはどのように失われますか?定期的な保存を強制する場合は、 '_.throttle'で置き換えることができます。 – ggozad

+1

@ ggozadフィールドがフォーカスされており、ユーザーがページを離れることを選択した場合、「次へ」ボタンをクリックすると、ブラーイベントが決してリクエストを発行しない可能性があります。キューがある場合は、キューが終了しているかどうかを確認してから、ユーザーに渡すことができます。 –