【问题标题】:backbone/underscore template in mustache format causing error on # pound/hash symbol?小胡子格式的主干/下划线模板导致#磅/哈希符号错误?
【发布时间】:2013-02-08 14:01:20
【问题描述】:

我正在使用带有小胡子格式模式的骨干网的下划线模板引擎。

我已经在项目的其他地方成功地使用了它,但现在我第一次使用来自 mustache 的循环列表模式来填充模板,该模板引发了我有点困惑的错误。 chrome中的错误是:

"Uncaught SyntaxError: Unexpected token ILLEGAL"

并在回溯中指向下划线的模板函数,这非常无用,但在萤火虫中我得到了一个更有用的错误,如下所示:

建议井号“#”是问题所在,这是有道理的,因为我知道 mustache 工作正常,因为项目的许多其他部分都在使用它,这也是我第一次使用我的模板中的哈希符号。它看起来像是循环功能或下划线的插值/模板设置的问题。

这是我模板的相关部分:

<div class="thumblist thumblistleft" id="currentprojectslist">
    <div class="thumb-list-header">
         <h2>current projects</h2>
    </div>
    <div class="thumb-list-area">
        <ol>
        {{#worklist}}       <!----- LOOK HERE --->
            {{#current}}
              <li><a>{{title}}</a></li>
            {{/current}}
        {{/worklist}}
        </ol>
    </div>
</div>

这是 JSON 的一个示例(所有验证都很好)

{blah blah blah lot in here before,"worklist":[{"thumb":"img/project-s.jpg","id":"340","title":"Test Project One","desc":"big load of content here","current":true}], and so on....}

我最初在此处遵循此示例以供参考: http://mustache.github.com/#demo

现在我认为问题可能出在哪里:

underscore.js 建议在渲染胡子模板之前使用它:

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

还有:

interpolate : /\{\{(.+?)\}\}/g

也只是 interpolate 语句,我都试过了。但是我的正则表达式知识真的很差,我觉得它可能无法容纳散列?无论如何....我完全被难住了。 有人可以帮我吗?

甚至可以像这样循环吗?查看下划线来源我不确定: http://documentcloud.github.com/underscore/docs/underscore.html#section-120

非常感谢

【问题讨论】:

  • 模式/\{\{([\s\S]+?)\}\}/g 将匹配{{#foo}} 并捕获#foo。您可以使用/\{\{#?([\s\S]+?)\}\}/g 避免捕获哈希,但我认为它会导致其他问题。
  • 你有没有设法像这样循环?我真的很想,用下划线写出一个简单的 if 跨多个评估行来检查我的 JSON 中是否存在标志是非常烦人的。
  • 嘿,很遗憾,下划线本身不会这样做,你必须包含 mustache.js 并执行 mustache.render,如下所示。我同意这真的很烦人

标签: javascript regex backbone.js underscore.js mustache


【解决方案1】:

今天遇到了这个问题。问题似乎是下划线执行模板的顺序:转义、插值、然后评估。因此,您需要在插值正则表达式中明确忽略 {{# 的任何匹配项:

_.templateSettings = {
  evaluate:    /\{\{#([\s\S]+?)\}\}/g,            // {{# console.log("blah") }}
  interpolate: /\{\{[^#\{]([\s\S]+?)[^\}]\}\}/g,  // {{ title }}
  escape:      /\{\{\{([\s\S]+?)\}\}\}/g,         // {{{ title }}}
}

它实际上与 Mustache 的工作方式不同:Underscore 的模板中没有适当的块,因此不需要关闭块 {{/}}。您只需像使用标准下划线模板一样匹配您的语句。

【讨论】:

  • 请注意,使用上述语法,您应该确保您的表达式和{{ }} 之间有一个空格。示例:{{ test }} 可以使用,{{test}} 不会。
【解决方案2】:

我发帖是为了其他面临此问题的人。 经过大量谷歌搜索无济于事后,我用细齿梳浏览了 underscore.js 源代码,基本上你必须使用下划线的模板语法,将丑陋的函数处理器写入你的 JSON 或将 mustache.js 包含到你的源代码中并调用:

Mustache.render(mytemplate,mymodel)

并放弃下划线的

_.template(..) function

烦人,但无论如何,我希望对某人有所帮助

【讨论】:

    【解决方案3】:

    我没有使用 # 符号,但是当我尝试使用三重胡须 {{{name}}} 来设置未转义的值时遇到了类似的错误:

    interpolate : /\{\{\{(.+?)\}\}\}/g,
    escape : /\{\{(.+?)\}\}/g,
    

    如果这就是你来这里的原因,那么以下设置有效

    interpolate : /\{\{\{(\s*\w+?\s*)\}\}\}/g,
    escape : /\{\{(\s*\w+?\s*)\}\}(?!\})/g,
    

    我尝试了 Max 的格式,但这对我不起作用,因为我混合了双胡子和三胡子表达式,虽然三重表达式工作正常,但它从双胡子变量名的每一端剥离了一个字符,即{{title}} 导致下划线查找名为 itl 的变量

    【讨论】:

    • 我来这里是为了最初的问题,按照答案,这个正则表达式对我有用,谢谢!
    • 如果有人遇到这个:{{title}} 导致下划线寻找一个名为itl 的变量,这实际上是 Niyaz 在 Max 的问题下面指出的:在表达式和大括号之间添加空格,它会工作。所以你需要写{{ title }},而不是{{title}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多