2012-10-09 17 views
23

Để sử dụng MomentJS trong chế độ xem/custom.ejs, cách chính xác (nếu có) là gì?Làm thế nào để sử dụng các mô-đun nút (như MomentJS) trong các khung nhìn EJS?

  1. Server side

    tuyến/index vv chúng ta có thể dễ dàng sử dụng require('moment'); vv và nó hoạt động tốt.

  2. Server Side (xem EJS)

    views/custome.ejs, một cái gì đó giống như <% var m = require('moment'); %> không hoạt động

Tôi đang sử dụng ExpressJS với EJS là mẫu động cơ.

Trả lời

1

Phía máy chủ (chế độ xem EJS) mà bạn đã đề cập ở trên đang chạy trên trình duyệt chứ không phải trên máy chủ của bạn. Bạn không thể sử dụng yêu cầu vì trình duyệt không thể hiểu được. Bạn cần nhập moment.js để sử dụng nó

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

Cảm ơn @Vinoth Tôi hiện đang xem mã kết xuất (phía trình duyệt) và Layout.ejs của tôi bao gồm: '' tùy chỉnh. ejs (xem) có mã sử dụng momentJS lib, ví dụ 'var a = moment (new Date());' Ở đây 'a' được tìm thấy là null. – dmodulus

+0

Kiểm tra liên kết này để xem cách sử dụng liên kết này - http://stackoverflow.com/questions/10967736/how-to-use-moment-js – Vinoth

+2

Từ hiểu biết của tôi, mã 'kèm theo' <% ... %> 'và' <%= ... %> 'được chạy/hiển thị ở phía máy chủ, ** không ** ở phía máy khách. Khách hàng chỉ nhận được kết quả được hiển thị (được xử lý) dưới dạng html thuần túy, trừ khi bạn đang sử dụng rõ ràng thẻ , thẻ này sẽ chạy ở phía máy khách. – dmodulus

10

Tôi sử dụng thời điểm ở phía máy chủ với ej. Tôi đã viết một hàm lọc ejs sẽ trả về từ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

nó có thể có thể linh hoạt hơn nếu bạn xuất khẩu thời điểm (ngày) chứ không phải là một hàm. Có thể làm việc, tôi chưa thử | moment.fromNow – chovy

1

Bạn có thể tạo các chức năng và đính kèm nó vào app.locals. và sử dụng nó trong mẫu ejs ở phía máy chủ.

Trong tuyến đường của bạn tập tin bạn làm

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

Chỉ cần nhớ để có khoảnh khắc thêm vào tập tin package.json của bạn

43

Tôi tìm thấy một cách khác để làm điều này, và tôi nghĩ rằng nó có một số lợi thế.

  • Đừng loại bỏ bộ lọc xuất mã của bạn.
  • Truy cập mọi phương thức mà không cần phải xuất tất cả.
  • Sử dụng ej tốt hơn (không có | ống).

Trên bộ điều khiển hoặc chế độ xem của bạn.js làm điều này:

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

Bây giờ bạn có thể sử dụng thời điểm bên trong EJS của bạn:

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

Tôi không phải là một chuyên gia Node, vì vậy nếu có ai nhìn thấy điều gì xấu về việc này, hãy để tôi biết! :)

+1

Đó là cách linh hoạt nhất IMO – shaharsol

+1

Hoạt động hoàn hảo, chỉ cần tổ chức gửi tất cả các lib bổ sung vào mẫu. –

14

Thêm một lựa chọn:

Bằng cách này bạn đang thiết lập các biến chút thời gian để một có sẵn tại địa phương cho tất cả các kịch bản trong bất kỳ trang EJS trên trang web của bạn.

Trong "index.js" của bạn (hoặc "app.js") tập tin làm việc này: (sau khi bạn đã thiết lập 'ứng dụng' của bạn với 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; 

Sau đó, trong EJS bạn nộp bạn có thể tham khảo thời điểm (và shortDateFormat) dưới dạng các biến số như sau:

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

Có lẽ điều này thanh lịch hơn một chút?

+1

giải pháp sạch nhất! – s2t2

0

cũng tôi nghĩ rằng đó là ý tưởng tốt nếu bạn muốn, bạn có thể thêm một trung đồ, nơi bạn có thể thêm bất cứ điều gì bạn muốn đến lớp chủ đề bao gồm cả người sử dụng, cấu hình và thời điểm:

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

Sử dụng trong chế độ xem:

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

Bây giờ bạn có thể chỉ cần sử dụng thời điểm trong tệp EJS của mình.

0

Làm thế nào về đi xuống require như thế này:

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

Bạn có thể cần phải tinh chỉnh để duy trì đường dẫn:

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

Rõ ràng việc này với Node (backend) mà thôi.