Backbone.js缓慢服务器save()响应覆盖本地更改的属性

时间:2012-10-11 19:10:51

标签: javascript backbone.js

我在Backbone模型中遇到了一些奇怪的行为 - 我在调用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);
        });

    });
});

1 个答案:

答案 0 :(得分:3)

是的,这是应该如何运作的。您的服务器具有规范的数据集,因此它会以真实值覆盖客户端状态。

如果您不希望或需要服务器在保存后更新客户端,则只需不返回任何更改的属性 - 只需使用空对象:{}