0

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

var Person = Backbone.model.extend({
    defaults: {
        name: '',
        age: 24
    }
});

var Car = Backbone.model.extend({
    defaults: {
        type: '',
        driving_person: null
    }
});

我有一个可以通过 ajax 调用调用的服务,它以以下格式返回 car json:

{
    car: {
        type: 'Honda Civic',
        driving_person: {
            name: 'dan',
            age: 13
        }
    }
}

我还在汽车模型中添加了引用该服务的 urlRoot 属性。
现在我想使用 fetch 来加载特定的汽车,但我想在driving_person 属性中获取带有人模型的汽车模型。怎样才能做到这一点?

4

1 回答 1

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属性name设置为嵌入式 json 驱动程序对象的属性。

当然,您也可以使用其他属性来引用和查找您的驱动程序,例如 id 或其他。

这样可以避免重复。

您需要为此定义 Driver 模型才能工作。

于 2012-11-14T19:34:54.180 回答