模型与其他模型的关系

时间:2012-11-14 19:27:48

标签: javascript backbone.js

我正在使用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属性中使用一个人模型获取汽车模型。怎么能实现这个目标?

1 个答案:

答案 0 :(得分:0)

您的汽车型号必须包含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属性。 / p>

您当然也可以使用其他财产来参考&寻找你的司机,如id或其他什么。

这样可以避免重复。

您需要为此定义驱动程序模型才能正常工作。