backbone:使用其他属性初始化模型子类

时间:2012-11-19 04:26:35

标签: javascript inheritance backbone.js model

我是骨干新手,所以请耐心等待。我想创建一个集合,其中模型都有一些它们共享的关键属性以及它们不共享的许多其他属性。我认为最好的方法是扩展一个超类模型(包含所有共享属性的默认值),这样当我实例化一个新的子类模型时,这些属性被初始化,并且特定于子类的其他属性也被添加到该模型。我不知道如何做到这一点,但这是我一直在努力的方向:

app.Fruit = Backbone.Model.extend(
{

    defaults: {
        name: "none",
        classification: "none",
        color: "none"
    },

    initialize: function()
    {
        console.log("Fruit Initialized");
    }

});

app.Apple = app.Fruit.extend(
{

    url: "/php/Apple.php",

    initialize: function()
    {
        console.log("Apple initialized");
        // somehow fetch additional information from server
        // and add sublcass-specific attributes to model
        // (for example, in the case of an apple, an attribute called cultivar)
    }

});


var FruitCollection = Backbone.Collection.extend(
{

    model: function(attributes, options)
    {

        switch(attributes.name)
        {

        case "Apple":
            return new app.Apple(attributes, options);
            break;

            default:
            return new app.Fruit(attributes, options);
            break;

        }

    }

    // ...

});

app.fruitCollectionCurrent = new FruitCollection([
    {name: "Apple"},
    {name: "Orange"}
]);

// logs: Fruit Initialized

有关如何正确初始化具有其他属性的子类的任何建议都将不胜感激。

感谢。

编辑:解决方案

我以为我会发布最终为我工作的代码...感谢@Mohsen的到来:

app.Fruit = Backbone.Model.extend(
{

    defaults: {
        name: "none",
        classification: "none",
        color: "none"
    },

    initialize: function()
    {
        console.log("Fruit Initialized");
    }

});

app.Apple = app.Fruit.extend(
{

    url: "/php/Apple.php",

    initialize: function()
    {
        console.log("Apple initialized");
        return this.fetch();
    }

});

我甚至不需要在子类中进行异步调用,因为我没有获取Fruit的任何其他数据(Fruit的属性只是在构造函数中设置),仅适用于Apple。我真正想要的是使用指定的URL调用this.fetch()。对不起,如果问题让事情看起来更复杂......

1 个答案:

答案 0 :(得分:0)

在层次结构方面,Backbone不易使用。我通过在我的子模型/集合初始化器中调用父模型/集合初始化器来解决这个问题。

Fruit = Backbone.Model.extend({
    url: "/fruits:id",
    initialize: function initialize () {
        this.set('isWashed', false);
        return this.fetch();
    }
});

Apple = Fruit.extend({
    url: "/fruits/apples:id"
    initialize: function initialize () {
            var that = this;
        Fruit.prototype.initialize.call(this, arguments).then(function(){
            that.fetch();
        })
        this.set("hasSeed", true);
    }
});

现在,您的Apple模型确实拥有Fruit的所有属性。

关键字是Fruit.prototype.initialize.call(this, arguments);。您为Fruit调用Apple的初始化方法。

您还可以使用this.__super__访问父模型:

this.__super__.prototype.initialize.call(this, arguments);