2012-10-09 2 views
23

views/custom.ejsでMomentJSを使用するには、正しい方法は何ですか?EJSビューでノードモジュール(MomentJSなど)を使用するにはどうすればいいですか?

  1. サーバー側

    ルート/インデックスなどは、我々は簡単にrequire('moment');などを使用することができますし、それが正常に動作します。

  2. サーバーサイド(EJSビュー)

    ビュー/ custome.ejs、<% var m = require('moment'); %>のようなものは、私はテンプレートエンジンとしてEJSとExpressJSを使用しています

動作しません。

答えて

1

上記のサーバー側(EJSビュー)は、サーバー上ではなくブラウザ上で実行されています。ブラウザはそれを理解できないため、requireを使用することはできません。あなたはそれを使用するためにmoment.jsをインポートする必要があります

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

ありがとう@Vinoth私は今レンダリングされたコード(ブラウザ側)を見ていて、Layout.ejsには次のものが含まれています: '' ejs(view)にはmomentJS libを使用したコードがあります。例 'var a = moment(new Date());'ここで 'a'はnullになります。 – dmodulus

+0

このリンクをチェックするには、このリンクをクリックしてください - http://stackoverflow.com/questions/10967736/how-to-use-moment-js – Vinoth

+2

私の理解では、 '<% ... %>'と '<%= ... %>'サーバー側では、**クライアント側で**ではありません。 タグを明示的に使用していない限り、クライアントはレンダリングされた(処理された)結果をプレーンhtmlとして取得します。クライアント側で実行されます。 – dmodulus

10

私はejsでサーバー側の瞬間を使用します。私はfromNowを返す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テンプレートで使用します。あなたのルートで

あなたは

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> 

ちょうど瞬間に追加することを忘れないでください

../routes/page.jsを行うファイルto package.jsonファイル

43

私はこれを行う別の方法を見つけました。私はそれにはいくつかの利点があると思います。

  • コードをエクスポートするコードを破棄しないでください。
  • すべてエクスポートする必要なしにすべてのメソッドにアクセスします。
  • より良いejsの使用法(パイプなし)。

コントローラまたはビューで。JS次の操作を行います。私は、ノードの専門家ではないので、誰もがこれを行うに悪い何かを見たら、私を聞かせて

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

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

は、今すぐあなたのEJS内の瞬間を使用することができます知っている! :)

+1

これは最も柔軟な方法です。IMO – shaharsol

+1

完璧に動作します。すべての余分なライブラリをテンプレートに整理するだけで済みます。 –

14

つ以上のオプション:

あなたのサイト上の任意のEJSページ内のすべてのスクリプトが利用できるローカルにモーメント変数を設定しているこの方法です。あなたの「index.js」(または「app.js」)では

ファイルは、次の操作を行います。(あなたはExpressであなたの「アプリ」を設定した後)

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; 

次に、あなたのEJSであなたを提出することができますこのような変数としてモーメント(および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() %> 

これで、EJSファイルで簡単に使用できます。このようrequireを伝承について

0

方法:

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

あなたがパスを維持するために微調整する必要があるかもしれません:

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

明らかにこれが唯一のノード(バックエンド)で動作します。

関連する問題