Underscore.js模板在JSP中的应用

28

Underscore.js 模板使用 <%= %> 进行变量插值。不幸的是,这也会在 JSP(或 GSP)中被解释。有没有一种方法可以在 JSP 中使用 Underscore.js 模板?

5个回答

74
在您的 jsp 页面中添加以下插值和评估设置。
_.templateSettings = {
    interpolate: /\<\@\=(.+?)\@\>/gim,
    evaluate: /\<\@(.+?)\@\>/gim,
    escape: /\<\@\-(.+?)\@\>/gim
};

然后,您可以使用<@ @>代替<% %>编写您的限定下划线变量、if和for语句,这样就不会与jsp发生冲突。


27
是的,问题已经得到回答了,但这是为那些像我一样更愿意使用复制粘贴解决方案的程序员准备的 :) - coderman
我已添加了该代码块并将所有标记更改为<@ @>,但似乎无法正常工作。有人能否解释一下我错在哪里? - jrutter
1
@coderman 感谢您理解匆忙中的普通程序员的真正需求。 - Jay

25

@coderman提供的示例很有帮助,但不幸的是,如果你想在模板中使用换行符,它就无法正常工作。例如:

   <@ 
      var numPages = 10;
      if ( numPages > 1 ) {
   @>
   <div><@=numPages@></div>
   <@}@>

问题在于evaluate的正则表达式无法像这里描述的那样跨越换行符匹配:JavaScript正则表达式多行标志不起作用

因此,对我有效的解决方案是:

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

注意:在 evaluate 正则表达式中,[\s\S]是关键点。


4
谢谢您!我一直在面临同样的问题。 - Gediminas Šukys

16
根据您提供的网页:如果 ERB 风格定界符不适合您,您可以更改 Underscore 的模板设置,以使用不同的符号来设置插入代码。建议您更改 interpolate 和 evaluate 正则表达式。这意味着您可以更改 <%= %> 的用法,使其不会与 JSP 冲突。

1
哦,天啊,我想我最好还是去看看文档!现在我感觉很愚蠢。;-) 感谢您的快速回复...问题已解决。 - erturne

5
该问题可以通过在代码中转义 <% 序列来解决:
<script id="tmpl" type="text/x-template">
    <span>Hello, <\%=name%></span>
</script>

因此,您不需要更改任何模板引擎逻辑。

0

另一个不需要全局替换的选项是指定插值和求值到特定的方法调用

 _.template($("#template-id").html(),null, {
   interpolate :  /\{\{\=(.+?)\}\}/g,
   evaluate: /\{\{(.+?)\}\}/g
 });`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接