10

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

ブラーの各コストを節約しています。

model.save()非常に短い間隔で複数回呼び出されます。create(post)1 つのリクエストを発行し、その後update(put)すぐに 1 つのリクエストを発行します。私が経験している問題は、PUT リクエストが POST の前にサーバーに到達することがあり、その結果、モデルが作成されて 2 回 (重複して) 永続化されることです。

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

これは「シングルページアプリ」で作業する一般的な問題のようですが、それについては何も見つかりません。

4

2 に答える 2

9

saveメソッドをオーバーライドして、遅延オブジェクトを使用してキューを作成できます。例えば、

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/

于 2012-04-04T08:18:24.703 に答える
3

underscore.jsdebounceのユーザー。

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

このようにすると、最後のblurイベントの後に1回だけ起動します。

于 2012-04-03T20:12:01.197 に答える