Views/custom.ejsでMomentJSを使用する場合、正しい方法(ある場合)は何ですか?
サーバ側
routes/indexなどrequire('moment');
などを簡単に使用でき、正常に機能します。
サーバー側(EJSビュー)
views/custome.ejs、<% var m = require('moment'); %>
のようなものは機能しません
テンプレートエンジンとしてEJSでExpressJSを使用しています。
これを行う別の方法を見つけましたが、いくつかの利点があると思います。
コントローラー、またはview.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>
私はNodeの専門家ではありません。だから、これを行うのに何か悪いことがあれば、私に知らせてください!:)
もう1つのオプション:
このように、モーメント変数を、サイトの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) %>
おそらくこれはわずかにエレガントです?
私は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()
}
var moment = require('moment');
app.locals.moment = require('moment');
ビューで使用:
<%= moment(myDateValue).fromNow() %>
EJSファイルでモーメントを使用できるようになりました。
次のようにrequire
を渡すのはどうですか:
res.render('index', { require: require });
パスを維持するために微調整する必要がある場合があります。
res.render('index', { require: module => require(module /* here you may insert path correction */) });
明らかにこれはNode(バックエンド)のみで機能します。
関数を作成し、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>
Package.jsonファイルに瞬間を追加することを忘れないでください
ejs
ビューとレイアウトで使用する瞬間を返すヘルパーを作成しました。
./helpers/utils/get-moment.js
const moment = require('moment');
module.exports = {
friendlyName: 'formatMoney',
description: 'format money number.',
inputs: {},
sync: true,
exits: {},
fn: function (inputs, exits) {
return exits.success(moment);
}
};
次に使用:
const moment = sails.helpers.utils.getMoment();
上記のサーバー側(EJSビュー)は、サーバーではなくブラウザーで実行されています。ブラウザは理解できないため、requireは使用できません。 moment.jsをインポートして使用する必要があります
<script src="/js/moment.min.js"></script>
また、ミドルウェアを追加して、user、config、momentなど、必要なものをテーマレイヤーに追加できるようにすることをお勧めします。
// 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();
});