3

我在服务器端使用node.js/ejs,在客户端使用backbone.js。服务器端和客户端都使用相同的模板样式。所以问题是,如果我将用于客户端的模板代码放在模板中,它仍然会在服务器端解析。

如果发现这样的工作:

<%- "<%= done ? 'done' : '' %\>" %>

但是,恕我直言,这会使代码变得丑陋,从而使使用模板的意义变得毫无用处。

你会如何处理这个问题?

有没有办法在 EJS 模板中定义不会像其他模板语言中使用的 {literal}-tag 那样被解析的代码块?

更新:现在我使用主干的 _.templateSettings 在客户端使用不同的分隔符。

更新:这是 JSP 上下文中的类似解决方案:Underscore.js Templates Within JSP

4

5 回答 5

3

我处理这个问题的方法是覆盖节点上的开始和结束标签,以便 ejs 的 2 个实例查找不同的标签。

在节点上,您可以传入选项

{open:'<%',close:'%>'}

在我的情况下,我使用 <% 和 <@ 作为我的两个版本。然后在节点 ejs 模板中我有这样的东西(其中名称来自骨干网,everyauth 显然来自节点):

<% if(everyauth.loggedIn) %><h1><@= name @></h1><% } %>
于 2012-02-24T14:28:25.893 回答
0

好吧,我目前的方法是使用require.js和文本插件;这允许我在开发期间使用 AJAX 包含模板,并在部署期间将它们全部编译为优化/缩小的单个文件包。

当然,如果您不使用 require.js 来管理其余 JS 代码的依赖关系,那么这将无法正常工作,但是现在我不能忍受没有 require.js 的 javascript dev 了反正我已经习惯了。

或者,您可以使用其他类似的技术来解决相同的问题。

于 2012-01-26T21:45:26.587 回答
0

backbone.layout.manager在客户端和服务器端都使用,因为我希望我的模板完全相同。

我解决模板分隔符问题的方法是在服务器端呈现页面,然后注入原始骨干模板。

于 2012-08-16T16:24:49.690 回答
0

使用新的 ejs,您可以在客户端添加自定义分隔符:

https://github.com/mde/ejs#custom-delimiters

例如:

自定义分隔符可以基于每个模板应用,也可以全局应用:

var ejs = require('ejs'),
    users = ['geddy', 'neil', 'alex'];

// Just one template
ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'});
// => 'geddy | neil | alex'

// Or globally
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'
于 2016-11-04T18:26:45.550 回答
0
于 2020-01-24T06:32:08.733 回答