web-dev-qa-db-ja.com

Backboneで親クラスにアクセスする

今日のように完全に上書きするのではなく、継承されたinitialize- class内から、親クラスのMyModelメソッドを呼び出す必要があります。

どうすればこれができますか?

現在、私のコードは次のようになっています。

BaseModel = Backbone.Model.extend({
    initialize: function(attributes, options) {
        // Do parent stuff stuff
    }
});

MyModel = BaseModel.extend({
    initialize: function() {
        // Invoke BaseModel.initialize();
        // Continue doing specific stuff for this child-class.
    },
});
67
Industrial
MyModel = BaseModel.extend({
    initialize: function() {
        MyModel.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
50
Raynos

試して

MyModel = BaseModel.extend({
    initialize: function() {
        BaseModel.prototype.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
128
Yury Tarabanko

私のモデル間で継承しようとしていたとき、これは私のために働いた:

MyModel.prototype.initialize.call(this, options);

http://documentcloud.github.com/backbone/#Model-extend からの参照

ありがとう。

11
rookieRailer

なると思う

MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.call(this);
        // Continue doing specific stuff for this child-class.
    },
});
5
wheresrhys

これはほとんど Super in Backbone の複製と思われるため、次のようなものが必要です。

Backbone.Model.prototype.initialize.call(this);
4
ErichBSchulz

@wheresrhysに似ていますが、BaseModel.initializeが引数を必要とする場合、呼び出しの代わりにapplyを使用します。初期化時にバックボーンモデルに渡すことができる属性マップの処理を避けようとしますが、BaseModelが実際にビューまたはコレクションである場合は、オプションを設定できます。

var MyModel = BaseModel.extend({
    initialize: function() {
        this.constructor.__super__.initialize.apply(this, arguments);
        // Continue doing specific stuff for this child-class.
    },
});
2

これが多世代のcallSuperメソッドです。拡張クラスに追加するだけです。

callSuper: function (methodName) {
    var previousSuperPrototype, fn, ret;

    if (this.currentSuperPrototype) {
        previousSuperPrototype = this.currentSuperPrototype;
        // Up we go
        this.currentSuperPrototype = this.currentSuperPrototype.constructor.__super__;
    } else {
        // First level, just to to the parent
        this.currentSuperPrototype = this.constructor.__super__;
        previousSuperPrototype = null;
    }

    fn = this.currentSuperPrototype[methodName];

    ret = (arguments.length > 1) ? fn.apply(this, Array.prototype.slice.call(arguments, 1)) : fn.call(this);

    this.currentSuperPrototype = previousSuperPrototype;

    return ret;
}
0
Bnaya