2012-04-23 59 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 %> 
<% } %>