【问题标题】:Boolean checks in underscore templates下划线模板中的布尔检查
【发布时间】:2012-05-15 09:06:44
【问题描述】:

为了与 asp.net webforms 兼容,我不得不替换默认的下划线 teplating delimiters/Interpolate regex。从网站上我选择了类似 mustache 的语法

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

试过了

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

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

以及执行任意 JavaScript 代码,使用

  • 那么我如何使用上面提到的插值执行任意js代码

【问题讨论】:

    标签: javascript templates underscore.js boolean-logic underscore.js-templating


    【解决方案1】:

    您的问题是您正在为 <%= ... %> 定义一个 Mustache 样式的替代品,但尝试在通常使用 <% ... %> 的地方使用它。来自fine manual

    定义一个 interpolate 正则表达式来匹配应该逐字插入的表达式,一个 escape 正则表达式来匹配应该在 HTML 转义后插入的表达式,以及一个 评估 正则表达式以匹配应该在不插入结果字符串的情况下进行评估的表达式。

    所以有三个正则表达式在起作用:

    1. interpolate 用于<%= ... %>
    2. escape 用于<%- ... %>
    3. evaluate 适用于<% ... %>

    您告诉Underscore 使用{{ ... }} 代替<%= ... %>,然后您收到错误,因为if(loggedIn) 无法插值。您只需要修复您的_.templateSettings 以反映您正在尝试做的事情:

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

    然后您的模板将如下所示:

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

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

    您需要在模板中包含{},因为_.template 在编译模板时会添加分号,结果如下:

    if(loggedIn) {; ...
    

    (感谢JaredMcAteer 指出这一点)。

    您可能还想添加一个 escape 正则表达式,可能是/\{\{-(.+?)\}\}/g

    【讨论】:

    • 这可能是我能找到的对Underscore 的templateSettings 最好的解释了。他们网站的解释还有很多不足之处......
    • 请注意您的小提琴显示Welcome James,无论loggedIntrue 还是false,在{{ if(loggedIn) { }}Welcome {{= name }}{{}}} 之前和之后添加大括号即可修复它。虽然不是很可读。
    • @JaredMcAteer:看来你是对的,_.template 正在将; 滑入编译版本,所以它显示if(loggedIn);...(你可以console.log(_.template($('#tmpl').html()).source) 看到它)。我会解决这个问题的。是的,所有这些大括号都变得有点多了。
    【解决方案2】:

    我相信这适用于向 mustache 样式语法的过渡:

    /**
         * @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}} 是插值,而评估可以是其他东西,如果您愿意,可以让您的模板更干净,因为插值是最常用的。

    【讨论】:

      【解决方案3】:

      只要您没有覆盖Underscore.templateSettings.evaluate 设置,您仍然可以使用:&lt;% ... %&gt; 来评估代码。

      我已经看到尝试定义 Underscore.templateSettings.evaluate 设置以匹配 Mustache 语法,但 Mustache 与 模板评估 的对抗非常强大,所以会很困难。

      【讨论】:

      • hmm 所以我最好使用专用的模板库:)
      • 如果你真的想要 Mustache,那么毫无疑问你需要使用专门的模板库。但是请记住,这个线程的起源是您需要在模板中“执行任意 js 代码”,而 Mustache 不会喜欢这样 :).. 虽然 Mustache 对简单的 boolean 块非常友好。跨度>
      • 是的,我不会劫持帖子。我会寻找解决方案,直到得到答复!令人惊讶的是,这也不起作用。嗯似乎我在这里做错了_.template("&lt;% if(completed)Welcome &lt;%= name%&gt;%&gt;",{name:"James",completed:true});
      • 我找到了它的工作原理,你必须在_.template("&lt;% if(completed){ %&gt;Welcome &lt;%= name%&gt;&lt;% } %&gt;",{name:"James",completed:false});下面做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多