2012-10-09 35 views
23

Para usar MomentJS en views/custom.ejs, ¿cuál es la forma correcta (si la hay)?¿Cómo usar módulos de nodo (como MomentJS) en vistas EJS?

  1. lado del servidor

    rutas/índice etc. podemos utilizar simplemente require('moment'); etc y funciona bien.

  2. el lado del servidor (vistas EJS)

    vistas/custome.ejs, algo así como <% var m = require('moment'); %> no funciona

estoy usando ExpressJS con EJS como el motor de plantillas.

Respuesta

1

El lado del servidor (vistas EJS) que mencionó anteriormente se está ejecutando en el navegador y no en su servidor. No puede usar require porque los navegadores no pueden entenderlo. Necesita importar el momento.js para usarlo

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

Gracias @Vinoth Ahora estoy mirando el código prestado (lado del navegador) y mi Layout.ejs incluye: '' custom. ejs (vista) tiene código usando momentJS lib, ejemplo 'var a = moment (new Date());' Here 'a' se considera nulo. – dmodulus

+0

Revise este enlace para ver cómo usarlo - http://stackoverflow.com/questions/10967736/how-to-use-moment-js – Vinoth

+2

Según entiendo, el código adjunto '<% ... %>' y '<%= ... %>' está en ejecución/procesado en el lado del servidor, ** no ** en el lado del cliente. El cliente solo obtiene los resultados representados (procesados) como html sin formato, a menos que esté utilizando explícitamente la etiqueta , que se ejecutará en el lado del cliente. – dmodulus

10

Uso el momento en el lado del servidor con ejs. Escribí una función de filtro de ejs que volverá de Now.

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

probablemente podría ser más flexible si exportó el momento (fecha) en lugar de una función. Podría funcionar, no lo he intentado | moment.fromNow – chovy

1

Puede crear la función y adjuntarlo a los app.locals. y usarlo en la plantilla ejs en el lado del servidor.

En sus rutas de archivo que

../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> 

Sólo recuerda tener añadió momento a su archivo package.json

43

Encontré otra manera de hacerlo, y creo que tiene algunas ventajas.

  • No contamines tu código exportando filtros.
  • Acceda a cualquier método sin la necesidad de exportarlos todos.
  • Mejor uso de ejs (no | pipes).

En su controlador, o ver.js hacer esto:

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

Ahora puede utilizar momento dentro de sus ejs:

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

No soy un experto de nodo, así que si alguien ve algo malo en hacer esto, me dejó ¡saber! :)

+1

Esa es la forma más flexible IMO – shaharsol

+1

Funciona perfecto, solo necesita organizar el envío de todas las librerías adicionales a la plantilla. –

14

Una opción más:

De esta manera se está configurando la variable de momento a un local disponible para todos los scripts en cualquier página de EJS en su sitio.

En sus "index.js" (o "app.js") Archivo de hacer esto: (después de haber configurado su 'app' con expreso)

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; 

Luego, en su EJS se puede presentar consulte el momento (y shortDateFormat) como variables como esta:

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

Quizás esto es un poco más elegante?

+1

¡la solución más limpia! – s2t2

0

También creo que es una buena idea si se desea se puede añadir un medio-ware donde se puede añadir cualquier cosa que desee a la capa de tema incluyendo usuario, configuración y momento:

// 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'); 

Uso en la vista:

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

Ahora puede simplemente usar el momento en sus archivos EJS.

0

¿Qué pasa abajo require así:

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

Es posible que tenga que ajustar para mantener la ruta:

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

Obviamente esto funciona con el Nodo (back-end) solamente.

Cuestiones relacionadas