0

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

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() 。对不起,如果这个问题让事情看起来更复杂......

4

1 回答 1

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模型确实具有 a 的所有属性Fruit

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

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

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

于 2012-11-19T04:38:28.260 回答