2014-12-18 11 views
10

Ich möchte eine Standard-Anzeigefunktion allen Modellen hinzufügen, die Metadaten verwenden, ähnlich den Attribut-/Zuordnungsdefinitionen, um Manipulationen an den Attributen/Assoziationen der Instanz vorzunehmen, die für die Anzeige in der Benutzeroberfläche geeignet sind.Wie kann ich eine Instanzmethode zu allen Modellen in sails.js hinzufügen?

zum Beispiel:

Foo.findOne(someId) 
 
    .exec(function(err, foo) { 
 
    ... 
 
    res.view({ 
 
     foo: foo.toDisplay(), 
 
    }); 
 
    });

So, würde Ich mag diese Funktion auch alle Modelle hinzuzufügen. Ich kann eine

Model.prototype.toDisplay = ... 

Lösung vorstellen, aber ich bin nicht sicher, wo zu bekommen Modell aus (einig lange erfordern (‚Wasserlinie /..../ Modell‘) Pfad?), Und wenn ich Model, wo, schnipp-it.

Bitte beraten.

+0

OK, mal sehen, ob das Hinzufügen von mehr Tags mehr als 12 Aufrufe in 40 Stunden (4 davon gehören mir). – umassthrower

Antwort

8

Die Modellkonfiguration ist vollständig dokumentiert here on SailsJS.org. @umassthrower weist richtig darauf hin, dass das Hinzufügen einer Instanzmethode zu config/models.js es allen Modellen hinzufügen würde. er ist auch korrekt bei der Beobachtung, dass dies nicht die beabsichtigte Verwendung der Konfigurationsdatei ist.

Der Grund, warum Sie in Sails als Rails etwas schwieriger finden, ist, dass Ruby echte Klassen und Vererbung hat, und Javascript nur Objekte hat. Eine ziemlich saubere Möglichkeit, die Vererbung zu simulieren und Ihre Modellobjekte von einem "Basis" -Objekt zu erweitern, wäre etwas wie Lodash's _.merge function zu verwenden.

// lib/BaseModel.js 
module.exports = { 

    attributes: { 

    someAttribute: 'string', 

    someInstanceFunction: function() { 
     // do some amazing (synchronous) calculation here 
    } 

    } 

}; 

Dann in Ihrer Modelldatei benötigen lodash und verwenden _.extend: Zum Beispiel könnten Sie Ihr Basismodell in lib/BaseModel.js speichern

// api/models/MyModel.js 
var _ = require('lodash'); 
var BaseModel = require("../../lib/BaseModel.js"); 
module.exports = _.merge({}, BaseModel, { 

    attributes: { 

    someOtherAttribute: 'integer' 

    } 

}; 

Die Attribute von Ihrem Basismodell mit MyModel zusammengeführt werden, mit MyModel hat Vorrang.

Das erste Argument für das leere Modell {} ist hier wichtig; _.merge ist destruktiv für das erste Objekt gesendet, also wenn Sie nur _.merge(BaseModel, {...} getan haben, dann würde das Basismodell geändert werden.

Denken Sie auch an npm install lodash!

+0

Das scheint ein vernünftiger Ansatz zu sein und schmackhafter als das Hinzufügen zu config/models.js. Ich muss immer noch eine zusätzliche Zeile zu jedem Modell hinzufügen, aber wenigstens einmal und dann habe ich diese Struktur an Ort und Stelle. Ich werde es versuchen, danke! – umassthrower

+0

Wie erwartet funktioniert das. Vielen Dank. – umassthrower

+0

Ich bin ein fauler Kerl, und wenn ich etwas zu jedem Modell hinzufügen will, nervt mich das, wenn ich gezwungen bin, jeder Modelldatei dieselbe Zeile hinzuzufügen. -1 - für mich ist es nicht die Frage beantworten - Sie müssen immer noch etwas mit jedem einzelnen Modell tun. – pie6k

-2

Attribute Dies kann durch Hinzufügen Ihrer Funktion zu Ihrem Modell vorgenommen werden, etwa so:

module.exports = { 
    attributes: { 
     attribute1: { 
      type: String 
     }, 
     attribute2: { 
      type: String 
     }, 
     toDisplay: function() { 
      // your function here 
     } 

     // You can also override model functions like .toJSON or .toObject 
     toJSON: function() { 
      // your custom JSON here 
     } 
    } 
} 

Dort in den Sails documentation for models weitere Informationen sind unter Attribute Methoden. Es lohnt sich, darauf hinzuweisen, dass Sie je nach dem, was Sie gerade tun, keine toDisplay() Methode benötigen; Sie können die Methode toJSON() einfach überschreiben, wenn Sie nur versuchen, eine Ausgabe zu formatieren oder vertrauliche Informationen zu entfernen.

+0

Ich habe schon, das Problem ist es auf jedem Modul zu setzen. Es kann sicherlich getan werden, und ich bin mir sicher, dass ich eine nicht upgrade-sichere Art und Weise herausfinden könnte, indem ich in den Kern der Wasserlinie eindringe und den Prototyp von etwas darin erweitere, aber ich hatte gehofft, dass es ein mehr sanktionierte Art und Weise es zu tun. Ich denke, du sagst, dass es in v0 nicht standardmäßig unterstützt wird.10, also muss ich es selbst herausfinden. – umassthrower

+0

Ich habe alle Dokumente durchgelesen und den Code der Wasserlinie durchgesehen, in dem die Standardmethoden zu Model hinzugefügt werden: https://github.com/balderdashy/waterline/tree/master/lib/waterline/model/lib/defaultMethods und https://github.com/balderdashy/waterline/blob/master/lib/waterline/model/index.js – umassthrower

+0

@umassthrower Ohhhh, ich missverstanden. Du versuchst es auf jedem Modul zu platzieren, kein einziges Modell ..... hmm. Das ist eigentlich eine gute Frage. Mein Fehler. –