2014-12-18 13 views
10

Vorrei aggiungere una funzione toDisplay predefinita a tutti i modelli che utilizzeranno i metadati, non diversamente dalle definizioni di attributo/associazione, per eseguire manipolazioni sugli attributi/associazioni dell'istanza rendendoli adatti alla visualizzazione nell'interfaccia utente.Come posso aggiungere un metodo di istanza a tutti i Modelli in sails.js?

ad esempio:

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

Quindi, mi piacerebbe aggiungere questa funzione anche tutti i modelli. Posso immaginare una soluzione

Model.prototype.toDisplay = ... 

, ma non sono sicuro dove trovare Modello da (alcuni richiedono lungo) percorso ('linea di galleggiamento /..../ modello'?), E se avessi modello, dove mettere quello snip-it.

Si prega di avvisare.

+0

OK, vediamo se aggiungere più tag ottiene più di 12 visualizzazioni in 40 ore (4 delle quali sono mie). – umassthrower

risposta

8

La configurazione del modello è completamente documentata here on SailsJS.org. @umassthrower ha ragione nel sottolineare che l'aggiunta di un metodo di istanza a config/models.js lo aggiungerebbe a tutti i tuoi modelli; ha anche ragione nell'osservare che questo non è l'uso previsto del file di configurazione.

Il motivo per cui questo è un po 'più difficile in Sails che in Rails è che Ruby ha classi e eredità reali e Javascript ha solo oggetti. Un modo abbastanza pulito per simulare l'ereditarietà e estendere gli oggetti del modello da un oggetto "base" sarebbe utilizzare qualcosa come Lodash's _.merge function. Per esempio si potrebbe salvare il modello base in lib/BaseModel.js:

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

    attributes: { 

    someAttribute: 'string', 

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

    } 

}; 

Poi, nel tuo file di modello, richiedono lodash e utilizzare _.extend:

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

    attributes: { 

    someOtherAttribute: 'integer' 

    } 

}; 

Gli attributi dal modello di base sarà fusa con MyModel, con MyModel ha la precedenza.

L'impostazione del primo argomento sul modello vuoto {} è importante qui; _.merge è distruttivo per il primo oggetto inviato, quindi se hai appena fatto _.merge(BaseModel, {...}, il modello base verrebbe modificato.

Inoltre, si ricordi di npm install lodash!

+0

Sembra un approccio ragionevole e più appetibile che aggiungerli a config/models.js. Dovrò ancora aggiungere una linea aggiuntiva a ciascun modello, ma almeno una volta e poi avrò quella struttura sul posto. Ci proverò, grazie! – umassthrower

+0

Come previsto, funziona. Grazie. – umassthrower

+0

Sono un tipo pigro, e se voglio aggiungere qualcosa ad ogni modello, essere costretto ad aggiungere la stessa linea ad ogni file di modello mi infastidisce davvero. -1 - per me non risponde alla domanda: devi ancora fare qualcosa con ogni singolo modello. – pie6k

-2

questo può essere fatto con l'aggiunta la funzione per il vostro modello di attributi, in questo modo:

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 
     } 
    } 
} 

C'è di più informazioni nel Sails documentation for models, sotto Metodi di attributi. Vale la pena notare che, a seconda di ciò che si sta facendo, potrebbe non essere necessario un metodo toDisplay(); potresti semplicemente ignorare il metodo toJSON() se stai solo provando a formattare un output o rimuovere qualsiasi informazione sensibile.

+0

Ho già questo, il problema è metterlo su ogni modulo. Certamente si può fare, e sono sicuro di riuscire a capire un modo non sicuro di fare l'upgrade facendo leva sul nucleo della linea di galleggiamento e estendendo il prototipo di qualcosa lì dentro, ma speravo che ci sarebbe stato un modo più sanzionato di farlo. Quindi suppongo tu stia dicendo che non è supportato in alcun modo standard in v0.10, quindi dovrò capirlo da solo. – umassthrower

+0

Ho letto tutti i documenti e ho esaminato il codice della linea di galleggiamento in cui i metodi predefiniti vengono aggiunti al modello: https://github.com/balderdashy/waterline/tree/master/lib/waterline/model/lib/defaultMethods e https://github.com/balderdashy/waterline/blob/master/lib/waterline/model/index.js – umassthrower

+0

@umassthrower Ohhhh, ho frainteso. Stai provando a posizionarlo su ogni modulo, non su un singolo modello ..... hmm. Questa è una buona domanda, in realtà. Colpa mia. –

Problemi correlati