4

当我尝试呈现以下模板时,在运行时出现编译错误:

 <script id="tmpl-books" type="text/template">
        <% _.each(items, function(item) { %>
            <ul>
                <li>Title: <%= item.title %></li>
                <li>Author: <%= item.author %></li>
            </ul>
        <% }); %>

    </script>

<script type="text/javascript">
      _.templateSettings = {
                evaluate: /\{\{=(.+?)\}\}/g,
                interpolate: /\{\{(.+?)\}\}/g,
                escape: /\{\{-(.+?)\}\}/g
            };

            var list =
            {
                items:
                [
                    { "title": "Myst: The Book of Atrus", "author": "Rand Miller" },
                    { "title": "The Hobbit", "author": "J.R.R. Tolkien" },
                    { "title": "Stardust", "author": "Neil Gaiman" }]
            };
            $(document).ready(function () {


                var tmplMarkup = $('#tmpl-books').html();
                // ...tell Underscore to render the template...
                var compiledTmpl = _.template(tmplMarkup, list);
                // ...and update part of your page:
                $('#rendered').append(compiledTmpl);
            });
</script>
4

1 回答 1

14

你有两个问题:

  1. 您的templateSettings正则表达式以一种糟糕的方式重叠。
  2. templateSettings的模板与您的模板不符。

文档没有明确说明正则表达式的应用顺序,但源代码是

var matcher = new RegExp([
  (settings.escape || noMatch).source,
  (settings.interpolate || noMatch).source,
  (settings.evaluate || noMatch).source
].join('|') + '|$', 'g');

特别是,interpolate将匹配之前evaluate。您interpolate正在寻找类似的东西,因此它会在您的正则表达式看到它们之前{{ ... }}拾取类似的东西。结果将迷失在生成的源代码中。因此,您的正则表达式无法匹配您将要查找的内容。您可能想要使用这些正则表达式:{{= ... }}evaluate=interpolateevaluate

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

请注意,我已经切换了寻找{{= ... }}和的人{{ ... }}

然后你的模板需要使用 Mustache 风格的分隔符而不是默认的下划线分隔符:

<script id="tmpl-books" type="text/template">
    {{ _.each(items, function(item) { }}
        <ul>
            <li>Title: {{= item.title }}</li>
            <li>Author: {{= item.author }}</li>
        </ul>
    {{ }); }}
</script>

解决这两个问题应该可以使事情正常进行。

演示:http: //jsfiddle.net/ambiguous/my49N/

于 2013-09-09T17:56:30.050 回答