2

バックボーン モデルで奇妙な動作が発生しています。呼び出してからサーバーが応答するまでの間に設定した属性save()がスローされ、サーバーの応答に置き換えられます (保存された属性をエコーするだけです)。

これは Backbone の本来の動作ですか? サーバーが少し遅れると、アプリが非常に狂ったように見えcurrentScreenます。画面を後方に移動する古い属性で属性が上書きされます。これが私のコードです:

Interview = Backbone.Model.extend({
    urlRoot: "/interviews",
    defaults: {
        "currentScreen": 0
    }
});

そして、これが私が期待することを説明する私の Jasmine/Sinon.JS テストです (それは で失敗しますExpected 0 to equal 1.):

describe("Interview model", function() {

    beforeEach(function() {
        this.interview = new Interview;
    });

    describe("saving with a slow server response", function() {

        beforeEach(function() {
            this.server = sinon.fakeServer.create();
        });

        afterEach(function() {
            this.server.restore();
        });

        it('should not overwrite locally changed attributes on server response', function() {
            this.server.respondWith("PUT", "/interviews/1",
                       [200, { "Content-Type": "application/json" },
                        '{"id":1,"currentScreen":0}']);
            this.interview.set({id: 1, currentScreen: 0});
            this.interview.save();

            this.interview.set({currentScreen: 1}); // user navigates to next screen
            this.server.respond(); // return fake response after currentScreen changed locally
            expect(this.interview.get('currentScreen')).toEqual(1);
        });

    });
});
4

1 に答える 1

3

はい、これが機能するはずの方法です。サーバーには正規のデータセットがあるため、クライアントの状態を真の値でオーバーライドします。

保存後にサーバーがクライアントを更新する必要がない場合は、変更された属性を返さないでください。空のオブジェクトを使用してください。{}

于 2012-10-11T20:06:38.230 に答える