2013-06-04 27 views
14

我有一個index.js:試圖格式化對玉模板日期

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

而且在我玉模板:

tr 
    td #{currentCourses[0].start} 

這是一個日期,格式爲「太陽2013年9月29日00:00:00 GMT + 0100(BST)「。

如何將它格式化爲「2013年9月29日」?

編輯(後編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)} 

回答

8

不是特別容易不幸。你需要一個函數來在你的模板中或者在外面格式化一個字符串(並且傳遞漂亮的字符串)。

像這樣的東西(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

啊確定。如果你有模板外的功能,你會如何傳遞它? – babbaggeii

+0

具有完全相同的功能(不帶'-'轉義字符),並首先在字符串上調用它。鑑於(我認爲)你有很多這些對象數組,它可能會更好只是保留在模板中,而不是遍歷整個對象首先將它們全部轉換。 –

+0

謝謝你。我已經添加了該代碼(請參閱我的編輯),現在出現以下錯誤:> 57 | -var d = date.getDate();對象沒有getDate方法。有任何想法嗎? – babbaggeii

-3

你應該格式化日期服務器端。限制模板內部完成的邏輯數量最小 - 理想情況下完全沒有。

+24

我會與此爭論。類似於日期格式化的東西恰好是你在模板中應該做的類型,而不是在控制器等中。 –

47

我的解決辦法是:

添加momentjs到您的Express應用程序當地人是這樣的:
app.locals.moment = require('moment');

然後你就可以在任何玉文件中使用的時刻:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

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

+0

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

2

Zhifeng Hu的上述解決方案給了我正確的方向。不幸的是,app.locals.moment沒有爲我工作。

但是,您也可以將require('moment')也直接傳遞給模板屬性的對象。

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

然後像往常一樣將數據對象傳遞給模板函數。

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

源文件例如:

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