50

要在views/custom.ejs 中使用MomentJS,正确的方法是什么(如果有的话)?

  1. 服务器端

    路线/索引等我们可以轻松使用require('moment');等,它工作正常。

  2. 服务器端(EJS 视图)

    views/custome.ejs,类似的东西<% var m = require('moment'); %>不起作用

我使用 ExpressJS 和 EJS 作为模板引擎。

4

10 回答 10

71

我找到了另一种方法,我认为它有一些优势。

  • 不要污染您的代码导出过滤器。
  • 无需全部导出即可访问任何方法。
  • 更好的 ejs 使用(无 | 管道)。

在您的控制器或 view.js 上执行以下操作:

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

现在你可以在你的 ejs 中使用 moment:

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

我不是 Node 专家,所以如果有人看到这样做有什么不好的地方,请告诉我!:)

于 2013-08-29T01:20:57.603 回答
33

另一种选择:

这样,您将 moment 变量设置为站点上任何 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) %>

也许这更优雅一些?

于 2014-11-03T06:07:28.710 回答
17
var moment = require('moment');
app.locals.moment = require('moment');

在视图中使用:

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

现在您可以简单地在您的 EJS 文件中使用 moment。

于 2017-06-02T02:43:28.273 回答
11

我在服务器端使用 ejs 的时刻。我写了一个从Now返回的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()
}
于 2012-10-09T08:05:49.523 回答
3

您可以创建函数并将其附加到 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 文件中

于 2013-04-02T15:53:20.753 回答
3

像这样传下去怎么require样:

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

您可能需要调整以维护路径:

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

显然,这仅适用于 Node(后端)。

于 2017-06-19T14:07:00.797 回答
0

您上面提到的服务器端(EJS 视图)是在浏览器上而不是在您的服务器上运行的。您不能使用 require ,因为浏览器无法理解它。您需要导入 moment.js 才能使用它

<script src="/js/moment.min.js"></script>
于 2012-10-09T07:47:24.363 回答
0

我也认为如果你想添加一个中间件是个好主意,你可以在其中添加任何你想要的东西到主题层,包括用户、配置和时刻:

// 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();
});
于 2016-03-08T12:25:13.753 回答
0

我写了一个助手来返回使用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();
于 2018-06-05T07:27:46.773 回答
0

从 Node v12.8.3 开始,您似乎可以require直接传递给 EJS 模板,即这样可以:

const ejs = require('ejs')
let renderedHTML = ejs.render(`<% const moment = require('moment') %>`, { require })
于 2020-08-26T13:00:53.363 回答