如何将Underscore.js模板与EJS一起使用?

它们都使用相同的语法来插入variables。 例如,如果我想要以下

<%= username %> 

在我的下划线中,我的主要EJS因为试图replace用户名而中断,并且主页中不存在这样的variables。

我认为方括号在默认情况下会在EJS中工作:

 [%= username %] 

如果您需要更加精彩的话,EJS github页面将介绍如何创build自定义标签:

 var ejs = require('ejs'); ejs.open = '{{'; ejs.close = '}}'; 
  • 我认为第二个“fancier”部分可能是针对服务器端应用程序的

https://github.com/visionmedia/ejs

使用客户端GitHub的例子,当你渲染时你需要做这样的语法:

 var html = require('ejs').render(users, { open: "^%", close: "%^" }); 

选项是render()的第二个参数。

我有这个问题,并认为我会分享我解决客户端问题的解决scheme。 这里是你如何改变转义正则expression式(通过underscore.js 文档 ):

 _.templateSettings = { interpolate : /\{\{(.+?)\}\}/g }; var template = _.template( "{{example_value}}"); 

将<%=%>更改为{{}}。

当我想在后端(express)使用ejs模板呈现网页时,我遇到了同样的问题,同时我必须在前端使用下划线模板。

我试过Marc的回答,但是这并没有帮助,我认为它已经过时了在新版本中使用。 在较新版本的ejs(我的是2.3.3 )中,不能再使用ejs.openejs.close ,而是使用ejs.delimiter

我在ejs中将分隔符更改为'$',所以ejs只能使用<$ $>标签处理插入variables,并将<% %>标记作为无意义的语法。

 app.set('view engine', 'ejs'); var ejs = require('ejs'); ejs.delimiter = '$'; app.engine('ejs', ejs.renderFile); 

注意:我将以上代码添加到app.js文件中的快速应用程序中,并且它工作正常,如果您想在前端使用它,只需在ejs.render(str, options)传递{'delimiter': '$'} ejs.render(str, options)作为选项参数。

我最近遇到这个问题,我不想重新configurationEJS,所以我改变了下划线如何插值,评估和转义值。

默认情况下,这里是当前的下划线模板设置:

 _.templateSettings = { interpolate: /<%([\s\S]+?)%>/g, evaluate: /<%=([\s\S]+?)%>/g, escape: /<%-([\s\S]+?)%>/g }; 

然后我更新了设置:

 _.templateSettings = { interpolate: /\{\{=([^}]*)\}\}/g, evaluate: /\{\{(?!=)(.*?)\}\}/g, escape: /\{\{-([^}]*)\}\}/g }; 

换句话说,上面的代码片段将改变下面的下划线:

    • 来自: <%= ... %>
    • 致: {{= ... }}
    • expression式: /\{\{=([^}]*)\}\}/g
  • 评估

    • 来自: <% ... %>
    • 致: {{ ... }}
    • expression:/ /\{\{(?!=)(.*?)\}\}/g
  • 逃逸

    • <%- ... %>
    • 致: {{- ... }}
    • expression式: /\{\{-([^}]*)\}\}/g

然后我的下划线模板如下所示:

 // Underscore <script type="text/template"> <ul> {{ _.each(collection, function(model) { }} <li>{{= model.text }}</li> <li>{{- model.textEscaped }}</li> {{ }); }} </ul> </script> 

…和我的EJS模板保持不变,我可以继续使用默认的ERB语法插入/评估值: <% ... %><%= ... %>

 // EJS <% if (isAuthenticated) { %> <%= user.displayName %> <% } %>