使用动态 URL 初始化时保存主干模型

Backbone model saving while initialized with dynamic url

本文关键字:保存 模型 初始化 动态 URL      更新时间:2023-09-26

我有一个骨干模型,如下所示

define([], function(){
    var instaceUrl;
    var PatientModel = Backbone.Model.extend({
        url: function() {
            return instanceUrl;
        },
        initialize: function(options) {
            instanceUrl = options.instanceUrl;
        },
        defaults: {
            "person": "",
            "identifiers":""
        }
    });
    console.log('Patient model');
    return PatientModel;
});

当我尝试保存患者模型patientModel.save时,请求有效负载中添加了一个额外的instanceUrl属性

var patientModel = new PatientModel({instanceUrl: '/patient'});
...
...
patientModel.set("identifiers", identifiers);
patientModel.set("person", uuid);
patientDetails = patientModel.toJSON();
patientModel.save(patientDetails, {
    beforeSend : sendAuthentication,
    success : function(model, response, options) {
        uuid = response.uuid;
    },
    error : function() {
        alert('failed');
    }
});

模型发送以下有效负载

{
    "instanceUrl": "/patient", // why is it added ?
    "person": "c014068c-824d-4346-84f0-895eb3ec6af7",
    "identifiers": [
        {
            "preferred": true,
            "location": "f15bc055-765a-4996-a207-ec4945972f33",
            "identifier": "saks9639",
            "identifierType": "866aedab-8a37-4b15-95d3-2b775fc0caac"
        }
    ]
}

成功调用 REST API 所需的有效负载为

{
    "person": "c014068c-824d-4346-84f0-895eb3ec6af7",
    "identifiers": [
        {
            "preferred": true,
            "location": "f15bc055-765a-4996-a207-ec4945972f33",
            "identifier": "saks9639",
            "identifierType": "866aedab-8a37-4b15-95d3-2b775fc0caac"
        }
    ]
}

如何避免patientModel考虑instanceUrl作为模型属性?

模型构造函数/初始化方法的方法签名为

构造函数/初始化新模型([属性],[选项])

其中传递的第一个对象将添加为属性。您在第一个哈希中传递instanceUrl,它被视为一个属性。请参阅此小提琴的演示:http://jsfiddle.net/nikoshr/GADW7/

使用第二个对象声明选项1

var PatientModel = Backbone.Model.extend({
    url: function() {
        return this.instanceUrl;
    },
    initialize: function(attrs, options) {
        this.instanceUrl = options.instanceUrl;
    },
    defaults: {
        "person": "",
        "identifiers":""
    }
});

你会把它实例化为

var patientModel = new PatientModel({}, {instanceUrl: '/patient'});

还有一个演示 http://jsfiddle.net/nikoshr/GADW7/1/


1 : 请注意,我将instanceUrl设置为实例的成员,使用全局变量,即使仅限于您的模块,也必然会导致困扰