2013-06-04 12 views
14

Ho un index.js:cercando di formattare una data sul modello di giada

exports.index = function(req, res){ 
    db.courses.find(function(err, currentCourses) { 
    res.render('index', { 
     currentCourses: currentCourses 
    }); 
    }); 
}; 

E il mio modello di giada:

tr 
    td #{currentCourses[0].start} 

Che è una data, formattata come "Sole 29 set 2013 00:00:00 GMT + 0100 (BST) ".

Come posso formattare su "29 set 2013"?

Edit (dopo i commenti di Ed Hinchliffe):

-function prettyDate(dateString){ 
    -var d = date.getDate(dateString); 
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; 
    -var m = monthNames[date.getMonth()]; 
    -var y = date.getFullYear(); 
    -return d+' '+m+' '+y; 
-} 
for course in currentCourses 
    tr 
     td #{prettyDate(course.start)} 

risposta

8

non particolarmente facile, purtroppo. Avrai bisogno di una funzione per formattare una stringa all'interno del tuo modello o all'esterno (e passare la bella stringa).

Qualcosa di simile (JADE)

-function prettyDate(dateString){ 
    //if it's already a date object and not a string you don't need this line: 
    -var date = new Date(dateString); 
    -var d = date.getDate(); 
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; 
    -var m = monthNames[date.getMonth()]; 
    -var y = date.getFullYear(); 
    -return d+' '+m+' '+y; 
-} 


tr 
    td #{prettyDate(currentCourses[0].start)} 
+0

Ah ok. Se hai la funzione al di fuori del modello, come la passeresti? – babbaggeii

+0

hanno esattamente la stessa funzione (senza i caratteri di escape '-'), e chiamano prima la stringa. Dato (presumo) ne possiedi molti in una serie di oggetti, potrebbe essere meglio tenerlo nel modello come sopra piuttosto che scorrere l'intero oggetto per prima cosa convertendoli tutti. –

+0

Grazie per quello. Ho aggiunto quel codice (vedi la mia modifica), e ora ho il seguente errore:> 57 | -var d = date.getDate(); l'oggetto non ha il metodo getDate. Qualche idea? – babbaggeii

-3

Si dovrebbe formattare il lato server data. Limitare la quantità di logica fatta all'interno del modello al minimo indispensabile - idealmente niente.

+24

Vorrei discutere con questo. Qualcosa come la formattazione della data è esattamente il tipo di presentazione che dovresti fare in un modello, non in un controller, ecc. –

47

La mia soluzione è:

Aggiungi momentjs ai vostri locali Application Express come questo:
app.locals.moment = require('moment');

quindi è possibile utilizzare momento in qualsiasi file di giada:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

Riferimento:
Making use of utility libraries in server-side Jade templates

+0

'td = moment (obj.timestampSent) .format ('DD.MM.YYY')' – Jadeye

2

La soluzione di cui sopra da Zhifeng Hu mi ha dato la giusta direzione. Purtroppo app.locals.moment non ha funzionato per me.

Ma è possibile passare anche lo require('moment') direttamente nell'oggetto per gli attributi del modello.

var data = { 
    title: 'some nice title', 
    updateDate: new Date(), 
    ...., 
    moment: require('moment') 
}; 

e quindi passare l'oggetto di dati come al solito alla funzione di modello.

var template = pug.compile(source); 
var html = template(data); 

Fonte esempio File:

doctype html 
html 
    head 
    title= title 
    body 
    div= moment(updateDate).format('YYYY-MM-DD') 
Problemi correlati