如何将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.open
和ejs.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 %> <% } %>