it-swarm.com.de

Wie werden Knotenmodule (wie MomentJS) in EJS-Ansichten verwendet

Was ist der richtige Weg (falls vorhanden), um MomentJS in views/custom.ejs zu verwenden?

  1. Serverseite

    routen/Index usw. Wir können problemlos require('moment'); usw. verwenden, und es funktioniert gut.

  2. Serverseite (EJS-Ansichten)

    views/custome.ejs, so etwas wie <% var m = require('moment'); %> funktioniert nicht

Ich verwende ExpressJS mit EJS als Template-Engine.

31
dmodulus

Ich habe einen anderen Weg gefunden, und ich denke, es hat einige Vorteile.

  • Polieren Sie nicht Ihren Code, der Filter exportiert.
  • Greifen Sie auf jede Methode zu, ohne sie alle exportieren zu müssen.
  • Bessere EJS-Nutzung (keine | Pipes).

Führen Sie auf Ihrem Controller oder in view.js Folgendes aus:

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

Jetzt können Sie Moment in Ihren Ejs verwenden:

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

Ich bin kein Node-Experte. Wenn also jemand etwas Schlimmes dabei sieht, lass es mich wissen! :)

54
robertomarin

Eine weitere Option:

Auf diese Weise setzen Sie die Moment-Variable auf eine lokale Variable, die für alle Skripts auf einer beliebigen EJS-Seite Ihrer Website verfügbar ist.

Führen Sie in Ihrer Datei "index.js" (oder "app.js") Folgendes aus: (nachdem Sie Ihre "App" mit Express eingerichtet haben)

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;

Dann können Sie in Ihrer EJS-Datei auf moment (und shortDateFormat) als Variablen wie folgt verweisen:

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

Vielleicht ist das etwas eleganter?

19
Matt Manuel

Ich verwende moment auf der serverseite mit ejs. Ich habe eine EJS-Filterfunktion geschrieben, die von Now zurückkommt.

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()
}
10
chovy
var moment = require('moment');
app.locals.moment = require('moment');

Verwenden Sie in der Ansicht:

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

Jetzt können Sie moment einfach in Ihren EJS-Dateien verwenden.

Wie wäre es, require so weiterzugeben:

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

Möglicherweise müssen Sie die Pfade anpassen, um den Pfad zu erhalten:

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

Dies funktioniert natürlich nur mit Node (Backend).

2
haxpanel

Sie können die Funktion erstellen und an app.locals anhängen. und verwenden Sie es in der EJS-Vorlage auf der Serverseite.

In deiner Routendatei machst du

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

Denken Sie nur daran, Ihrer package.json-Datei einen Moment hinzuzufügen 

1
user2125268

Die Serverseite (EJS-Ansichten), die Sie oben erwähnt haben, wird im Browser und nicht auf Ihrem Server ausgeführt. Sie können die Anforderung nicht verwenden, da Browser dies nicht verstehen können. Sie müssen die moment.js importieren, um sie verwenden zu können

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

Ich habe einen Helfer geschrieben, um die EJS-Ansicht und das Layout wiederzugeben.

./helfer/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);
  }
};

Dann mit:

const moment = sails.helpers.utils.getMoment();
0
phuong nguyen

ich denke auch, dass es eine gute Idee ist, wenn Sie möchten, können Sie eine Middleware hinzufügen, in der Sie der Designebene beliebige Elemente hinzufügen können, einschließlich Benutzer, Konfiguration und 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();
});
0