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

知っている問題と知らない問題の 2 つがあります。

最初の問題は、その_.templateSettingsうちの 1 つだけを交換したいときに 3 つすべてを交換していることです。あなたはこれを求めている:

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

evaluateこれにより、とescapeの部分はそのままになり_.templateSettingsます。あなたがしていることは次と同じです:

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

だからあなたは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 に答える