模型与其他模型的关系

adolor 发布于 2019-02-11 backbone.js 最后更新 2019-02-11 21:14 9 浏览

我正在使用backbone.js,我有以下未解决的情况:
假设你有两个模型:

var Person = Backbone.model.extend({
    defaults: {
        name: '',
        age: 24
    }
});
var Car = Backbone.model.extend({
    defaults: {
        type: '',
        driving_person: null
    }
});
我有一个服务,我可以调用ajax调用,它以下列格式返回汽车json:
{
    car: {
        type: 'Honda Civic',
        driving_person: {
            name: 'dan',
            age: 13
        }
    }
}
我还在汽车模型中添加了引用该服务的urlRoot属性。
现在我想使用fetch来加载特定的汽车,但是我希望使用driving_person属性中的人物MODEL获得汽车模型。如何实现这一目标?
已邀请:

qfugit

赞同来自:

您的汽车型号必须包含user_id或user_name或某些属性, 这样您就可以获取该数据并在后端进行嵌入。 您还需要使用模型的parse()方法。 您重写它以解析来自服务器的json响应, 当您解析时,您将自动在骨干中创建用户模型 (如果已经创建,则参考它)。 但我认为你也可以在创建汽车模型的同时做到这一点, 在它的initialize()方法中。 这可能会更好。 但是,如果您要问的是如何根据用户选择合适的汽车,当您从服务器请求数据时,则此逻辑位于服务器端。 您需要在服务器端实现它。 如果你想在客户端的模型中嵌入一个driving_person,就像你的json响应一样,只需定义你的driving_person属性,它就会有json对象作为它的值。 如果您想在汽车模型中嵌入新的Backbone.Model,则需要处理汽车模型的initialize()。 甚至可能是parse()。 编辑: 如果要在获取后将用户模型嵌入到汽车模型中,则需要覆盖构造函数方法:

var Car = Backbone.Model.extend({
constructor: function(data, options){
        this.driving_person = new User(data.driving_person);
        delete data.driving_person;
        Backbone.Model.prototype.constructor.call(this, data);
    }
/// Your other model code like initialize, etc.
编辑2: 如果你想避免每辆车都有一个新的驱动模型(因为可能会有更多的汽车共享相同的驱动程序),那么你应该有一个全局变量(甚至是一个集合), 需要驱动程序模型。 它必须是代码中先前定义的全局集合。 然后,在我给你的构造函数中添加驱动程序到该全局集合。 假设您在代码中先前定义了一个全局DriverCollection (你这样做:
window.DriverCollection = Backbone.Collection.extend({
    model: Driver,
然后,你会像这样制作你的汽车模型:
var Car = Backbone.Model.extend({   
    constructor: function(data, options){           
        if (!window.DriverCollection.find(function(driver){return driver.name == data.driving_person.name;}))
        {window.DriverCollection.add(driving_person);}
        data.driving_person = data.driving_person.name;
        Backbone.Model.prototype.constructor.call(this, data);
    }       
    /// Your other Car model code like initialize etc.
这样,Car构造函数接收JSON数据并将驱动程序添加到全局DriverCollection(如果它不存在),并将汽车的driving_person属性设置为嵌入式json驱动程序对象的name属性。 您当然也可以使用其他财产来参考&寻找你的司机,如身份证或其他什么。 这样可以避免重复。 您需要为此定义驱动程序模型才能工作。