27

レンダリング用のバックボーンビューにフィードしているbackbone.js/underscore.jsテンプレートがあります。postsビューには、オブジェクトの配列(postテンプレートで呼び出す)を含むモデルが渡されます。

問題:配列のすべての要素をループしようとするとposts、エラーが発生Uncaught SyntaxError: Unexpected token )し、バックボーンビューのコードの行を参照しますtemplate: _.template( $('#tpl_SetView').html() )

このエラーの原因となっているループを間違って実行していますか?

テンプレートコード

<script type="text/template" id="tpl_SetView">
    <div class="row_4">
        <div class="photo_container">
            <div class="set_cover">
                <img src="/<%= posts[0].thumb_subpath %><%= posts[0].img_filename %>" width=240 />
            </div>
            <div class="set_thumbs">
                <%= _.each(posts, function(post) { %>
                    <img src="<%= post.thumb_subpath %><%= posts.img_filename %>" width=55 />
                <%= }); %>
            </div>
        </div>
    </div>
</script>
4

2 に答える 2

53

変数をエコーするには、を使用します<%= %>が、javaScriptコードを解析するには、を使用します<% %>

例えば:

// In your Backbone View
var posts = {"posts": this.model.toJSON()};
var template = _.template($("#tpl_SetView").html(), posts);


// In your template
<div class="row_4">
    <div class="photo_container">
        <div class="set_cover">
            <img src="/<%= _.escape(posts[0].thumb_subpath) %><%= _.escape(posts[0].img_filename) %>" width=240 />
        </div>
    <div class="set_thumbs">
        <% _.each(posts, function(post){ %>
            <img src="<%= _.escape(post.thumb_subpath) %><%= _.escape(posts.img_filename) %>" width=55 />
        <% }); %>
        </div>
    </div>
</div>
于 2012-08-02T15:44:09.087 に答える
4

問題は次の行にあることがわかると思います。

<%= _.each(posts, function(post) { %>
    <img src="<%= post.thumb_subpath %><%= posts.img_filename %>" width=55 />
<%= }); %>

テンプレートを評価するためにアンダースコアが何をするかを思い出したところ、これらの行はあまり意味がありません。 各<%= ..%>項目は個別に評価されます。つまり、部分的な関数ブロックではなく、完全に評価可能な式である必要があります。

編集:実際、ジェームズは正しいです。<%..%>は個別に定義できます(最終的には大きなjavascript文字列になります)。それはエスケープされ、補間された式は別個の式でなければなりません。

編集II:それでも、評価のコンテキストでは、関数ブロックを使用すると、意図したとおりに評価されない可能性のある奇妙なjavascript文字列が作成される可能性があると思います...私はそれについて考える必要があります。それでも完全にうまくいくかもしれません。

于 2012-08-02T15:42:59.183 に答える