2014-01-08 11 views
7

Ich möchte einen benutzerdefinierten Satz von Attributen und Lebenszyklusmethoden erstellen, die für alle meine Sails.js-Modelle freigegeben sind.Vererben Attribute und Lebenszyklusfunktionen von Sails.js-Modellen

Sails.js erstellt und registriert die Modellobjekte automatisch, indem sie die Methode Waterline.Collection.extend() aufruft und die Modelldefinition im Verzeichnis /api/models bereitstellt.

Was wäre der beste Weg, um meine Modelldefinition von einem Elternteil zu erweitern? Ich habe bereits versucht, _.extend(sails.config.model.parentModel, childModel) verwenden, aber leider ist das sails Objekt nicht global ausgesetzt (da dies nach dem Laden der Orm-Hook getan wird). Ich könnte auch einfach das Basismodell in allen meinen Modellen require() erweitern und erweitern.

Was wäre ein sauberer Ansatz, der gut zu Sails passt?

+0

habe gerade herausgefunden, dass es 'sails.config.model', die mit jedem Modell während Normalisierungs verschmolzen wird. Ist es sinnvoll, dies als Basismodell bei der Implementierung von Lifecycle-Funktionen zu verwenden? Mein Basismodell definiert die 'toJSON()' Methode. Was muss ich tun, wenn meine Kindermodelle dies auch überschreiben müssen? –

+0

Momentan behalte ich das Verhalten der Eltern 'toJSON()' beim Überschreiben intakt. –

Antwort

10

Die Verwendung von config/models.js zur Bereitstellung globaler Standardwerte für Modelle ist absolut gültig. Bezüglich überragender Instanz- und Klassenmethoden gibt es nach meinen Tests nichts Besonderes zu beachten. Durch das Definieren einer Eigenschaft/Methode, die in einer Modelldefinition in sails.config.models enthalten ist, wird sie für dieses Modell überschrieben, was nicht definiert ist.

Definitionen:

// config/models.js 
module.exports.models = { 
    attributes: { 
    // base model instanceMethod 
    toJSON: function() { 
     console.log('base.toJSON'); 
     return this.toObject(); 
    } 
    }, 

    // base model classMethod 
    test: function() { 
    console.log('base.test'); 
    } 
}; 


// api/models/first.js 
module.exports = { 
    attributes: { 

    }, 

    // Overriding classMethods and lifecycle callbacks 
    test: function() { 
    console.log('first.test'); 
    } 
}; 

// api/models/second.js 
module.exports = { 
    attributes: { 
    // Overriding instance methods and attributes 
    toJSON: function() { 
     console.log('second.toJSON'); 
     return this.toObject(); 
    } 
    }, 
} 

Tests

> sails.models.first.test(); 
>'first.test' // sails.config.models.test overridden 

> sails.models.first.findOne(1).exec(err,res){ res.toJSON(); }); 
> 'base.toJSON' // sails.config.models.attributes.toJSON not overridden 

> sails.models.second.test(); 
> 'base.test'; // sails.config.models.test not overridden 

> sails.models.second.findOne(1).exec(err,res) { res.toJSON(); }); 
> 'second.toJSON' // sails.config.models.attributes.toJSON overridden 
+2

Ist es möglich, die Elternmethode aufzurufen? Aufruf von 'sails.models.toJSON()' wie folgt wird "no method" Fehler obwohl ich die Funktion aufgelistet (über 'console.log') sehen kann. // api/Modelle/second.js module.exports = { Attribute: { // Überschreiben von Methoden und Attribute Instanz toJSON: function() { var somethingelse = sails.models.toJSON(); // andere Dinge tun .. zurück etwasElse; } }, } – Dida