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

階層に関しては、バックボーンを扱うのは簡単ではありません。子モデル/コレクション初期化子内で親モデル/コレクション初期化子を呼び出すことで、この問題を解決します。

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);. Fruitforの initialize メソッドを呼び出しますApple

this.__super__親モデルへのアクセスにも使用できます。

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

于 2012-11-19T04:38:28.260 に答える