1

我已将下划线设置为小胡子模式,如下所示:

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

我有以下模板的一部分:

<script id="detail_view" type="text/template">
    <% for(registration in REGISTRATION_NUMBERS){ %>
        <tr>
            <td>{{registration.TYPE}}</td>
            <td>{{registration.VALUE}}</td>
        </tr>
<% } %>
</script>

这导致“未定义注册”。使用this会导致整个部分在模板中输出。我究竟做错了什么?

4

1 回答 1

4

你有两个问题,一个你知道,一个你不知道。

第一个问题是,_.templateSettings当您只想替换其中一个时,您正在替换所有三个。你要这个:

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

这将留下evaluateescape部分_.templateSettings单独。你在做什么是一样的:

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

所以你最终没有 a evaluate。顺便说一句,您可以查看source已编译模板函数的属性以查看您的模板编译为的 JavaScript,JavaScript 看起来并不容易,但查看它可以帮助解决此类问题。

您不知道的问题是for...in循环用于迭代对象的属性,而不是数组中的值。这意味着这registration将是您循环中的字符串'0', '1', ... ,这不是您想要的。REGISTRATION_NUMBERS如果是数组,您的模板中需要这样的东西:

<% for(var i = 0; i < REGISTRATION_NUMBERS.length; ++i) { %>
    <% var registration = REGISTRATION_NUMBERS[i]; %>
    <tr>
        <td>{{registration.TYPE}}</td>
        <td>{{registration.VALUE}}</td>
    </tr>
<% } %>

或者,因为无论如何你都有下划线,你可以使用_.each

<% _(REGISTRATION_NUMBERS).each(function(r) { %>
    <tr>
        <td>{{r.TYPE}}</td>
        <td>{{r.VALUE}}</td>
    </tr>
<% }) %>

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

于 2012-11-06T02:46:07.253 回答