2

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

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

试过这个

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

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

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

  • 那么我如何使用上述插值执行任意js代码
4

3 回答 3

15

您的问题是您正在定义一个 Mustache 样式的替代品,<%= ... %>但试图在您通常使用的地方使用它<% ... %>。来自精美手册

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

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

  1. 插值适用于<%= ... %>.
  2. 逃避是为了<%- ... %>
  3. 评估是针对<% ... %>.

你告诉下划线使用{{ ... }}代替,<%= ... %>然后你得到一个错误,因为if(loggedIn)不能被插值。您只需要修复您的问题_.templateSettings以反映您正在尝试做的事情:

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

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

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

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

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

if(loggedIn) {; ...

(感谢JaredMcAteer指出这一点)。

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

于 2012-05-15T16:09:45.417 回答
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
    };

这将是 mustache 样式语法,但保留了使用“=”和“-”的原始选项。不使用任何一个评估 JS,例如 for 循环。可以交换它们,以便 {{var}} 是插值,而评估可以是其他东西,如果您愿意,可以保持模板更清洁,因为插值是最常用的。

于 2012-05-15T20:23:43.177 回答
0

只要您没有覆盖Underscore.templateSettings.evaluate设置,您仍然可以使用:<% ... %>评估代码。

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

于 2012-05-15T09:18:41.440 回答