1

アンダースコア テンプレート エンジン (Backbone.js の一部として) を使用していますが、JSON オブジェクトの属性にピリオドが含まれているという問題があります。

{
"id": 1234,
"company.id": 4321
}

アンダースコア テンプレートでこれにアクセスしようとすると、JavaScript エラーが発生します。

Company ID: <@= company.id @>

可能かどうか、またピリオドを含む属性にアクセスする方法を知りたいです。私は JSON の生成を変更する立場にありません。

カウパー

4

1 に答える 1

4

これを回避する簡単な方法は、別のオブジェクトをラップして、 を使用[]してアクセスできるようにすることです'company.id'。たとえば、テンプレートは次のようになります。

<script id="tmpl" type="text/html">
    id: <%= o.id %><br>
    company: <%= o['company.id'] %>
</script>​

そしてあなたのJavaScriptは次のようになります:

var html = _.template($('#tmpl').html(), {
    o: {
        "id": 1234,
        "company.id": 4321
    }
});

デモ: http://jsfiddle.net/ambiguous/wtLkP/1/ Underscore テンプレート コンパイラは、テンプレートwithなどの単純なもののコンテキストを提供するために使用するため、<%= x %>これ以上のことはできないと思います。上記のo.トリックよりも。sourceUnderscore はテンプレートから関数を作成します。関数の属性を見ると、関数のソースを確認できます。

var t = _.template(template_source);
console.log(t.source);

それはあなたに次のようなものを与えるでしょう:

function(obj){
var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};
with(obj||{}){
__p+='\n    id: '+
( o.id )+
'<br>company: '+
( o['company.id'] )+
' and stuff\n';
}
return __p;
}

なぜ<%= [x] %>うまくいかないのかがわかります。with現在のスコープを調整するだけで、[x]有効な JavaScript にすることはできません。

于 2012-05-30T00:12:56.960 に答える