2013-06-04 12 views
14

Mam index.js:próbuje sformatować datę w szablonie jade

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

I na moim jade Szablon:

tr 
    td #{currentCourses[0].start} 

co jest data, sformatowane jako „Sun 29 wrz 2013 00:00:00 GMT + 0100 (BST) ".

Jak sformatować plik na "29 września 2013"?

Edit (po komentarzach Eda Hinchliffe za):

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

Odpowiedz

8

Nie jest szczególnie łatwy niestety. Będziesz potrzebował funkcji formatowania ciągu wewnątrz szablonu lub na zewnątrz (i przeprowadź ładny ciąg).

coś takiego (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. Jeśli masz funkcję poza szablonem, w jaki sposób przekażesz ją? – babbaggeii

+0

ma dokładnie tę samą funkcję (bez znaków "-' escape") i najpierw wywołaj ją na łańcuchu. Biorąc pod uwagę (zakładam), że masz ich wiele w szeregu obiektów, lepiej byłoby po prostu zachować je w szablonie jak wyżej, zamiast powtarzać cały obiekt, najpierw konwertując je wszystkie. –

+0

Dzięki za to. Dodałem ten kod (zobacz moją edycję), a teraz dostaję następujący błąd:> 57 | -var d = date.getDate(); obiekt nie ma metody getDate. Jakieś pomysły? – babbaggeii

-3

należy sformatować datę po stronie serwera. Ogranicz ilość logiki wykonanej w szablonie do absolutnego minimum - najlepiej nic.

+24

Chciałbym się z tym spierać. Coś takiego jak formatowanie daty jest dokładnie tym typem prezentacji, którą powinieneś zrobić w szablonie, nie w kontrolerze itp. –

47

Moje rozwiązanie to:

Dodaj momentjs do wyraźnej mieszkańców aplikacji tak:
app.locals.moment = require('moment');

Następnie można użyć chwilę w dowolnych plików jade:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

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

+0

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

2

Powyższe rozwiązanie z Zhifeng Hu dało mi właściwy kierunek. Niestety app.locals.moment mi nie pomogło.

Ale można również przekazać require('moment') bezpośrednio do obiektu dla atrybutów szablonu.

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

Następnie przenieś obiekt danych jak zwykle do funkcji szablonu.

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

Źródło przykład pliku:

doctype html 
html 
    head 
    title= title 
    body 
    div= moment(updateDate).format('YYYY-MM-DD') 
Powiązane problemy