save方法出现意外行为

时间:2016-03-18 22:42:06

标签: javascript backbone.js underscore.js

以下是我的观点和模型。显然,每次我为serverRequestData的每次调用准备一份新的initiateTest数据并将其传递给save方法。

因此,我的服务器调用应该与serverRequestData中存在的数据一起发生。它在第一次调用initiateTest时正确发生,但从第二次开始,我看到先前服务器调用的响应已通过。

这看起来很奇怪,因为很明显我每次都在准备新的initiateTest

我做错了什么,这搞砸了backbone.js的一些内部事情?

查看:

define(['jquery', 'underscore', 'backbone', 'models/adhocmodel', 'models/resultmodel',
        'text!templates/adhoc/adhocTemplate.html'], function($, _, Backbone,
        adhocModel, resultModel, adhocTemplate) {

    var adhocHistoryView = Backbone.View.extend({

        resultmod : new resultModel(),
        model : new adhocModel(),
        el : $("#container"),

        events : {
            "click #test" : "initiateTest"
        },

        initiateTest : function() {
            var serverRequestData = {"myid":"AAA",
                       "fname":"Wade",
                       "lname": "Wade",
                       "telephoneNumber":telNum,
                       "testMode":"Initial" };

            console.log(serverRequestData);

            var that = this;
            this.model.save(serverRequestData, {
                url: "forms/serviceDiagnostic/startTest",
                type: "POST",
                contentType: "application/json",
                success : function(model, response) {
                    that.model.adhocCommon.hasTestResultArrived = true;
                    that.model.testResults = response;
                    that.render();
                    $('#container').trigger("create");
                },
                error : function(model, response) {
                    console.log("####### Error recieved ....");
                }
            });
        },

        initialize : function() {
        },

        render : function() {

            console.log(this.model);

            //this.$el.html(adhocTemplate);
            var data = {
                    model:this.model,
                    _:_
            };
            var compiledTemplate = _.template(adhocTemplate, data );

            this.$el.html(null);
            this.$el.html(compiledTemplate);
            return this;
        }
    });

    return adhocHistoryView;
});

型号:

define([ 'backbone' ], function(Backbone) {

    var adhocModel = Backbone.Model.extend({

        initialize : function() {

        },

        poolHandler : null,

        poolCounter : 0,

        adhocCommon : {
            hasTestResultArrived : false
        },

        testResults : {}

    });

    return adhocModel;
});

1 个答案:

答案 0 :(得分:2)

这就是Model.save()的工作原理。 Backbone希望您的服务器能够响应服务器中模型的最新状态,并且您的模型将使用该响应进行更新。

此外:

  

属性hash(如set中所示)应该包含您想要更改的属性 - 未提及的键不会被更改 - 但是,资源的完整表示将被发送到服务器   (强调我的

因此,在您第一次通话后,模型将随服务器响应一起更新,并且从下一次开始,它将与您传递给((+) 1) 2的属性一起发送。

如果要更改发送到服务器的内容,可以覆盖save()方法,如果要在收到响应时更改更新为模型的内容,可以定义{{3}方法。