我在服务器端使用node.js/ejs,在客户端使用backbone.js。服务器端和客户端都使用相同的模板样式。所以问题是,如果我把为客户端准备的模板代码放在一个模板中,它仍然会在服务器端被解析。
如果发现这样的东西管用:
<%- "<%= done ? 'done' : '' %\>" %>
然而,恕我直言,这在某种程度上丑化了代码,使使用模板的全部意义毫无用处。
您将如何处理此问题?
有没有办法在EJB模板中定义代码块,这些代码块不会像其他模板语言中使用的{literal}标记那样被解析?
**更新:**现在我使用backbone的_.templateSettings在客户端使用不同的分隔符。
**更新:**下面是JSP上下文中的一个类似解决方案:Underscore.js Templates Within JSP
5条答案
按热度按时间s3fp2yjn1#
我处理这个问题的方法是覆盖node上的开始和结束标记,这样ejs的2个示例就可以查找不同的标记。
在节点上,您可以传入选项
在我的例子中,我使用〈%和〈@作为我的两个版本。然后在节点ejs模板中,我有这样的东西(其中name来自 Backbone 网,everyauth显然来自节点):
lbsnaicq2#
我假设这个问题可以读如下,因为它是这个线程谷歌提供我在第一个链接:
“如何仅对有限的项目转义EJS模板代码分隔符标记?"
使用
<%# %>
中断原始解析代码(例如,<<%# %>%= done ? 'done' : '' %<%# %>>
将执行以下未解析代码<%= done ? 'done' : '' %>
)假设我决定使用
{ delimiter: '?' }
选项将%
更改为?
(这里可能是这种情况,因为我们不想使用相同的Has Backbone.js)。很好,这就解决了你的问题。现在想象一下,稍后,由于某种原因,你使用模板系统生成一个XML。这个XML将以
<?xml version="1.0" encoding="UTF-8"?>
开头。你将再次面临同样的问题。怎么办?你将再次更改分隔符?然后,你将再次更改?等等。不,对于准时转义,我们应该只是能够说“不将文档的这一部分解析为EJS”。
因此,一个技巧是避免EJS理解它是一个EJS定界符解析器。因此,避免它(在我们当前的情况下)解析
<?
(或在原始情况下的<%
)。因此,通过简单地添加
<?# ?>
来中断解析,您将不添加任何内容(#
项是用于EJS注解的),并且您将避免解析器理解<<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>>
。结语
为了准时避免EJS解析,您可以使用
<%# %>
作为定界符标记断开器来欺骗解析器生成您需要的输出。当然,可能在您的情况下,您可以只使用标记的答案,因为您将在许多情况下使用EJS标记。
olqngx593#
我目前处理这个问题的方法是使用require.js和文本插件;这允许我在开发时使用 AJAX 包含模板,并在部署时将它们全部编译到优化/缩小的单个文件包中。
当然,如果你不使用require.js来管理其余JS代码的依赖关系,这就不会很好地工作,但是我不能忍受在没有require.js的情况下进行javascript开发,因为我已经习惯了。
或者,您也可以使用其他类似的技术来解决相同的问题。
y53ybaqx4#
我在客户端和服务器端都使用
backbone.layout.manager
,因为我希望我的模板完全相同。我解决模板分隔符问题的方法是在服务器端呈现页面,然后注入原始 Backbone.js 模板。
0md85ypi5#
对于新的ejs,您可以在客户端添加自定义分隔符:
https://github.com/mde/ejs#custom-delimiters
例如:
自定义分隔符可以按模板应用,也可以全局应用: