我应该在哪里定义要在 EJS 模板中调用的 JS 函数

Where should I define JS function to call in EJS template

我正在处理一个模板,我正在尝试使用 express 和 ejs 呈现模板。至于节点应用程序的标准结构,我有 app.js 文件,其中包含如下功能:

app.locals.getFlag = function(country) {
var flag_img_name = "";
if (country.toLowerCase() == "us") {
    flag_img_name = "flag_us16x13.gif";
}   
else if (country.toLowerCase() == "ca"){
    flag_img_name = "flag_ca16x13.gif";
}
return flag_img_name;
}

我有 some_template.ejs 文件调用此函数如下:

<img src="http://some_url_path/<%=getFlag(data_point[0].country_name) %>" width="16" height="14" alt="country" >

而且效果很好。但是,我有大约 15-20 个这样的函数,我不想在 app.js 中定义所有这些函数。是否有任何其他地方可以定义这些函数并以与我现在相同的方式在模板中调用它们?如果是,那么定义它们的方式是什么,以便像现在一样访问它们。

我是 node、express 和 ejs 的新手,不确定不同的技术。如果有人能阐明它,那就太好了。提前谢谢你。

只是在这里发布这个答案,供那些在解决相同问题时可能会遇到这个问题的人使用。

您所要做的就是创建新文件(比如 functions.ejs)并将其包含在要调用该函数的 .ejs 文件中。所以,我在名为 functions.ejs:

的文件中有这样的功能
<%
getPriceChgArrow = function(value) {
    arrow_img_name = "";
    if (value < 0) {
        arrow_img_name = "arrow_down12x13.gif";
    }
    else {
        arrow_img_name = "arrow_up12x13.gif";
    }
    return arrow_img_name;
}
%>

然后将 functions.ejs 包含到您要从中调用函数的文件中。比如说,我想在 quote.ejs 文件中调用这个函数。因此,我会将其包含如下:

<% include *file_path*/functions %> 

只需在您要调用它的 ejs 文件中的适当位置使用此函数。例如:

<img src = "http:/some_url/<% getPriceChgArrow(data_point[0].value) %>" />

一切就绪。希望这对某人有所帮助。

好吧,由于某种原因,接受的答案对我来说并不适用。此外, 为我的每个函数创建一个单独的 *.ejs 文件,然后在视图中导入该文件也没有意义 - 特别是当我要实现非常简单的逻辑时.

其实定义函数并在视图中使用是非常简单易行的

我这样做了:

<%
   // ------ Define a function
   get_tree = function(tree){
      for(var i in tree){
%>
     <%= tree[i].title %>
<%
      }
   }
  // ----- Call the above declared function
  get_tree(tree);
%>

而且有效!

谢谢

似乎最简单的方法是将附加到对象的函数与渲染的所有数据一起传递:

在你的 js 中:

const data = {
  ...all other data,
  getFlags: function(country) {
    var flag_img_name = "";

    if (country.toLowerCase() == "us") {
      flag_img_name = "flag_us16x13.gif";
    } else if (country.toLowerCase() == "ca"){
      flag_img_name = "flag_ca16x13.gif";
    }

    return flag_img_name;
  }
};

ejs.render(template, data);

在您的模板中:

<img src="http://some_url_path/<%=getFlag(data_point[0].country_name) %>" width="16" height="14" alt="country" >

在 js 文件中,创建函数的实例,例如:如果您的函数名称是 test ()Var ren = test (); 将创建对此函数的引用。

在将数据呈现到 ejs 页面之前,将引用变量 ren 添加到该对象:

Data.ren = ren();

Res.render(Data)

现在在 ejs 中,当您调用 <% ren() %> 时,它会调用函数。

您可以只需要一个单独的文件并将 app.locals 设置为此

app.locals = require('./path/helpers')

在helpers.js中:

getFlag = function(country) {
var flag_img_name = "";
if (country.toLowerCase() == "us") {
    flag_img_name = "flag_us16x13.gif";
}   
else if (country.toLowerCase() == "ca"){
    flag_img_name = "flag_ca16x13.gif";
}
return flag_img_name; 
}
anotherFunction=function(x){
return 'hello '+x
}

   module.exports={getFlag, anotherFunction}

设置文件的顺序对定义函数的方式很重要。执行是自上而下的,而不是文档评估。下面的例子来设置你的功能。

document.html

<section class="container">
    <%- include('./helpers/common') %>
    <%- include('./home') %>
</section>

common.ejs

<%
MyFunction = function() {
    // Write your code here
}
%>

home.ejs

<% if(MyFunction() ) { %>
    <!-- Write your HTML markup -->
<% }%>

在js文件中创建常用函数helper.js.

function common1() {
    //function body
}
function common2(key) {
    //function body
}
module.exports = {
    common1: common1,
    common2: common2
}

然后在你的节点函数中需要这个文件

var helper = require('./helper');

然后用 ejs render 传递这个助手

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

并且使用你的函数是ejs文件

<%= helper.common1() %>

就是这样