web-dev-qa-db-fra.com

Accéder à la classe parente dans le backbone

Je dois appeler la méthode initialize de la classe parente, depuis l'intérieur de la classe MyModel- héritée, au lieu de l'écraser complètement comme je le fais aujourd'hui.

Comment pourrais-je faire ça?

Voici à quoi ressemble mon code:

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

Essayer

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

Cela a fonctionné pour moi, alors que j'essayais d'hériter parmi mes modèles:

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

Référencé depuis http://documentcloud.github.com/backbone/#Model-extend

Merci.

11
rookieRailer

Je pense que ce serait

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

cela semble être presque une copie de Super dans Backbone , donc vous voulez quelque chose comme ça:

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

Semblable à @wheresrhys, mais j'utiliserais apply au lieu de call au cas où BaseModel.initialize attend des arguments. J'essaie d'éviter de traiter la mappe d'attributs pouvant être transmise à un modèle de colonne de base lors de l'initialisation, mais si le modèle de base était en fait une vue ou une collection, je pourrais peut-être définir des options.

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

voici une méthode callSuper multi génération, ajoutez-la simplement à votre classe d'extension.

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