Pour utiliser MomentJS dans views / custom.ejs, quelle est la bonne manière (le cas échéant)?
Du côté serveur
routes / index, etc., nous pouvons facilement utiliser require('moment');
etc et ça marche bien.
Côté serveur (vues EJS)
views / custome.ejs, quelque chose comme
ne fonctionne pas
J’utilise ExpressJS avec EJS comme moteur de gabarit.
J’ai trouvé un autre moyen de le faire et je pense que cela présente certains avantages.
Sur votre contrôleur ou view.js, procédez comme suit:
var moment = require('moment'); exports.index = function(req, res) { // send moment to your ejs res.render('index', { moment: moment }); }
Maintenant, vous pouvez utiliser le moment dans votre ejs:
<%= moment().fromNow() %>
Je ne suis pas un expert en nœud, alors si quelqu’un voit quelque chose de mauvais en le faisant, faites-le-moi savoir! 🙂
Une autre option:
De cette façon, vous définissez la variable moment sur un emplacement local disponible pour tous les scripts de toutes les pages EJS de votre site.
Dans votre fichier “index.js” (ou “app.js”), procédez comme suit: (après avoir configuré votre “application” avec 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;
Ensuite, dans votre fichier EJS, vous pouvez faire référence à moment (et shortDateFormat) sous forme de variables comme celle-ci:
<%= moment(Date()).format(shortDateFormat) %>
C’est peut-être un peu plus élégant?
J’utilise moment sur le serveur avec ejs. J’ai écrit une fonction de filtre ejs qui reviendra de Now.
npm install moment
./views/page.ejs
<%=: item.created_at | fromNow %>
./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');
Utiliser dans la vue:
<%= moment(myDateValue).fromNow() %>
Maintenant, vous pouvez simplement utiliser moment dans vos fichiers EJS.
Qu’en est-il de la transmission require
comme ceci
res.render('index', { require: require });
Vous devrez peut-être modifier pour maintenir le chemin:
res.render('index', { require: module => require(module /* here you may insert path correction */) });
Évidemment, cela fonctionne avec Node (backend) uniquement.
Le côté serveur (vues EJS) que vous avez mentionné ci-dessus est exécuté sur le navigateur et non sur votre serveur. Vous ne pouvez pas utiliser require car les navigateurs ne peuvent pas le comprendre. Vous devez importer le moment.js pour l’utiliser
Vous pouvez créer la fonction et l’attacher à app.locals. et utilisez-le dans le modèle ejs côté serveur.
Vous faites dans votre fichier de routes
../routes/page.js
var ejs = require('ejs') , moment = require('moment'); app.locals.fromNow = function(date){ return moment(date).fromNow(); }
../views/page.ejs
<%= fromNow(item.created_at) %>
Rappelez-vous simplement d’avoir un moment ajouté à votre fichier package.json
Je pense aussi que c’est une bonne idée si vous voulez, vous pouvez append un middle-ware où vous pouvez append ce que vous voulez à la couche thème, y compris utilisateur, configuration et 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(); });
J’ai écrit un aide pour revenir moment pour utiliser sur la vue ejs et les présentations.
./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); } };
Puis en utilisant:
const moment = sails.helpers.utils.getMoment();