在下划线模板布尔检查(Boolean checks in underscore templates)

2019-06-24 10:51发布

我不得不更换默认的下划线teplating分隔符/插值的正则表达式兼容asp.net webforms.From的网站,我选择了类似的语法小胡子

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

试过这种

_.template("{{if(loggedIn)Welcome {{name}}}}",{name:"James",completed:true});

但似乎这是没有办法的办法(因为发生错误)使用模板系统检查布尔表达式。 但是从文档看来,这是可能的

以及执行任意JavaScript代码,用<%...%>

  • 那么,如何执行任意JS代码与上面提到的插值

Answer 1:

你的问题是,你定义胡子样式替代<%= ... %>但尝试使用它,你会正常使用<% ... %> 。 从精细的手工 :

定义一个插值的正则表达式匹配应该逐字插值表达式,一个逃逸正则表达式匹配是HTML转义后出应插入的表达式和一个正则表达式评估以匹配应在不插入进行评估到所得到的字符串表达式。

所以有三个正则表达式中发挥作用:

  1. 内插是用于<%= ... %>
  2. 逃避<%- ... %>
  3. 评估<% ... %>

你告诉下划线使用{{ ... }}代替<%= ... %>然后你得到一个错误,因为if(loggedIn)不能插入。 你只需要修复您的_.templateSettings反映你想要做什么:

_.templateSettings = {
    evaluate:    /\{\{(.+?)\}\}/g,
    interpolate: /\{\{=(.+?)\}\}/g
};

然后你的模板应该是这样的:

{{ if(loggedIn) { }}Welcome {{= name }} {{ } }}

演示: http://jsfiddle.net/ambiguous/RwgVg/8/

你需要包括{}的模板,因为_.template编译模板时增加了分号,这导致了诸如:

if(loggedIn) {; ...

(感谢JaredMcAteer指出这一点)。

您可能要添加转义正则表达式为好,这很可能是/\{\{-(.+?)\}\}/g



Answer 2:

我相信这个工程,为过渡到胡子样式语法:

/**
     * @configuration transform Underscore.js template syntax
     * @description change the Ruby on Rails style syntax to the Mustache syntax
     * @default <%= var %>
     * @modified 
     *  evaluate        {{ JavaScript code}}    execute arbitrary js code, such as loops
     *  interpolate     {{= variable }}         prints value of variables
     *  escape          {{- variable }}         this syntax will html escape variables
     */ 
    _.templateSettings = {
        evaluate:    /\{\{(.+?)\}\}/g,          
        interpolate: /\{\{=(.+?)\}\}/g,
        escape: /\{\{-(.+?)\}\}/g
    };

这将是胡子样式语法,但保留使用“=”和原来的选项“ - ”。 不使用任何评估板JS,比如for循环。 人们可以围绕交换它们,以使{{VAR}}是插值和评估可能是别的东西,如果你希望将自己的模板清洗器,因为插值是最常用的。



Answer 3:

至于你还没有覆盖的Underscore.templateSettings.evaluate设置,您应该仍然可以使用: <% ... %>为评估代码。

我见过的尝试也定义Underscore.templateSettings.evaluate设置以匹配与小胡子的语法,但胡须地对抗模板的评价非常强劲,因此是会很困难。



文章来源: Boolean checks in underscore templates