2012-10-09 10 views
23

विचारों/custom.ejs में MomentJS का उपयोग करने के लिए, सही तरीका क्या है (यदि कोई है)?ईजेएस विचारों में नोड मॉड्यूल (जैसे MomentJS) का उपयोग कैसे करें?

  1. सर्वर साइड

    मार्गों/सूचकांक आदि हम आसानी से require('moment'); आदि का उपयोग कर सकते हैं और यह ठीक काम करता है।

  2. सर्वर साइड (EJS views)

    विचारों/custome.ejs, <% var m = require('moment'); %> की तरह कुछ

मैं टेम्पलेट इंजन के रूप में EJS साथ ExpressJS उपयोग कर रहा हूँ काम नहीं करता।

उत्तर

1

ऊपर वर्णित सर्वर साइड (ईजेएस विचार) ब्राउज़र पर चल रहा है, न कि आपके सर्वर पर। आप आवश्यकता का उपयोग नहीं कर सकते क्योंकि ब्राउज़र इसे समझ नहीं सकते हैं। आप moment.js आयात करने के लिए यह

<script src="/js/moment.min.js"></script> 
+1

धन्यवाद @ विनोथ मैं अब प्रस्तुत कोड (ब्राउज़र पक्ष) देख रहा हूं और मेरे लेआउट.ईजे में शामिल हैं: '<स्क्रिप्ट टाइप =" टेक्स्ट/जावास्क्रिप्ट "src =" जावास्क्रिप्ट/moment.min.js ">' कस्टम। ejs (देखें) में पलजेएस lib का उपयोग करके कोड है, उदाहरण 'var a = moment (new date());' यहां 'ए' शून्य पाया जाता है। – dmodulus

+0

यह लिंक देखने के लिए इस लिंक को देखें - http://stackoverflow.com/questions/10967736/how-to-use-moment-js – Vinoth

+2

मेरी समझ से, '<% ... %>' और '<%= ... %>' संलग्न कोड चलाया/प्रस्तुत किया गया है सर्वर की तरफ, ** नहीं ** ग्राहक पक्ष पर। ग्राहक को केवल टैग का उपयोग करके स्पष्ट रूप से प्रस्तुति (संसाधित) परिणाम प्राप्त होते हैं, जो क्लाइंट पक्ष पर चलेंगे। – dmodulus

10

मैं EJS साथ सर्वर साइड पर पल का उपयोग का उपयोग करने की जरूरत है। मैंने एक ईजेएस फिल्टर फ़ंक्शन लिखा है जो अब से वापस आ जाएगा।

npm install moment 

./views/page.ejs

<span class="created_at"><%=: item.created_at | fromNow %></span> 

./routes/page.js

var ejs = require('ejs') 
    , moment = require('moment'); 

ejs.filters.fromNow = function(date){ 
    return moment(date).fromNow() 
} 
+0

यदि आप फ़ंक्शन के बजाए पल (दिनांक) निर्यात करते हैं तो यह शायद अधिक लचीला हो सकता है। काम कर सकते हैं, मैंने कोशिश नहीं की है moment.fromNow – chovy

1

आप समारोह बना सकते हैं और app.locals में अटैच कर सकते हैं। और सर्वर पक्ष पर ejs टेम्पलेट में इसका उपयोग करें।

अपने मार्गों में आप

../routes/page.js कर फाइल

var ejs = require('ejs') 
    , moment = require('moment'); 

app.locals.fromNow = function(date){ 
    return moment(date).fromNow(); 
} 

../views/page.ejs

<span class="created_at"><%= fromNow(item.created_at) %></span> 

बस पल जोड़ लिया है के लिए याद आपके पैकेज.जेसन फ़ाइल

43

मुझे ऐसा करने का एक और तरीका मिला, और मुझे लगता है कि इसमें कुछ फायदे हैं।

  • अपने कोड निर्यात फ़िल्टर को प्रदूषित न करें।
  • उन सभी को निर्यात करने की आवश्यकता के बिना किसी भी विधि तक पहुंचें।
  • बेहतर ईजेएस उपयोग (नहीं | पाइप)।

अपने नियंत्रक पर, या देखें।js ऐसा करते हैं:

var moment = require('moment'); 
exports.index = function(req, res) { 
    // send moment to your ejs 
    res.render('index', { moment: moment }); 
} 

अब आप अपने EJS अंदर पल का उपयोग कर सकते हैं:

<html> 
    <h1><%= moment().fromNow() %></h1> 
</html> 

मैं एक नोड विशेषज्ञ नहीं हूँ, इसलिए यदि किसी को भी कुछ ऐसा करने पर बुरा देखते हैं, मुझे जानना! :)

+1

यह सबसे लचीला तरीका है आईएमओ – shaharsol

+1

सही काम करता है, बस टेम्पलेट में सभी अतिरिक्त libs भेजने को व्यवस्थित करने की आवश्यकता है। –

14

एक और विकल्प:

इस तरह आप अपनी साइट पर किसी EJS पेज की सभी स्क्रिप्ट के लिए एक स्थानीय उपलब्ध करने के लिए पल चर सेट कर रहे हैं।

अपने "index.js" में (या "app.js") फ़ाइल ऐसा करते हैं: अपने EJS में फिर

var moment = require('moment'); 
var shortDateFormat = "ddd @ h:mmA"; // this is just an example of storing a date format once so you can change it in one place and have it propagate 
app.locals.moment = moment; // this makes moment available as a variable in every EJS page 
app.locals.shortDateFormat = shortDateFormat; 

(के बाद आप एक्सप्रेस द्वारा अपने 'ऐप्लिकेशन' की स्थापना की है) आप दायर कर सकते हैं पल (और शॉर्टडेट फ़ॉरमेट) को इस तरह के चर के रूप में देखें:

<%= moment(Date()).format(shortDateFormat) %> 

शायद यह थोड़ा अधिक सुरुचिपूर्ण है?

+1

सबसे साफ समाधान! – s2t2

0

भी मुझे लगता है कि यह अच्छा विचार है आप उपयोगकर्ता, config और पल सहित विषय परत के लिए कुछ भी आप चाहते हैं जोड़ सकते हैं जहाँ आप एक मध्यम बर्तन में जोड़ सकते हैं चाहते हैं:

// config, user, moment to the theme layer 
app.use(function (req, res, next) { 
    // grab reference of render 
    var _render = res.render; 
    // override logic 
    res.render = function (view, options, fn) { 
     // extend config and continue with original render 
     options = options || {}; 
     options.config = config; 
     options.moment = moment; 
     if (req.user && req.user.toJSON) { 
      options.user = req.user.toJSON(); 
     } 
     _render.call(this, view, options, fn); 
    } 
    next(); 
}); 
6
var moment = require('moment'); 
app.locals.moment = require('moment'); 

उपयोग दृश्य में:

<%= moment(myDateValue).fromNow() %> 

अब आप बस अपनी ईजेएस फाइलों में पल का उपयोग कर सकते हैं।

0

कैसे इस तरह require नीचे गुजर के बारे में:

res.render('index', { require: require }); 

आप पथ बनाए रखने के लिए बदलाव करने की आवश्यकता हो सकती:

res.render('index', { require: module => require(module /* here you may insert path correction */) }); 

जाहिर है यह केवल नोड (बैकएंड) के साथ काम करता है।

संबंधित मुद्दे