2012-04-23 79 views
9

它们都使用相同的语法来插入变量。例如,如果我想以下如何将Underscore.js模板与EJS一起使用?

<%= username %> 

在我的下划线,我的主要EJS符,因为它试图取代用户名和在主要页面没有这样的变量存在。

+0

为什么你需要两个?正如这里提到的那样,方括号是否起作用? http://code.google.com/p/embeddedjavascript/wiki/Testing – Marc 2012-04-23 14:47:43

+1

我正在使用EJS与Backbone.js – deltanovember 2012-04-23 20:02:18

+0

是方括号为你工作? – Marc 2012-04-23 20:21:30

回答

9

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

[%= username %] 

如果你需要更大胆的尝试,在EJS GitHub的页面介绍如何创建自定义标签:

var ejs = require('ejs'); 
ejs.open = '{{'; 
ejs.close = '}}'; 
  • 我认为第二个“发烧友”部分可能特定于服务器端应用程序

https://github.com/visionmedia/ejs

使用客户端GitHub的例子,你需要做这样的语法,当您呈现:

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

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

10

我有这个问题,并认为我会分享我解决客户端问题的解决方案。这是找您的逃生正则表达式(通过underscore.js docs)如何:

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

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

1

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

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

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

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

注:我补充上面的代码中app.js文件中明确的应用程序和它工作得很好,如果你想使用它的前端,只是通过{'delimiter': '$'}ejs.render(str, options)作为选项的说法。

0

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

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

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

然后我的设置更新为:

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

换句话说,该片段上方将改变强调以下几点:

  • 插值

    • 来源:<%= ... %>
    • 要:{{= ... }}
    • 表达:/\{\{=([^}]*)\}\}/g
  • 评估

    • 来源:<% ... %>
    • 要:{{ ... }}
    • 表达:/\{\{(?!=)(.*?)\}\}/g
  • 逃生

    • <%- ... %>
    • 要:{{- ... }}
    • 表达:/\{\{-([^}]*)\}\}/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 %> 
<% } %>