backbone.jsとコンパニオンテンプレートエンジンをアンダースコアで使用すると、レンダリング時にmodel
を渡す代わりにほとんどの例がmodel.ToJSON()
を呼び出していることに気付きました。私は自分のテンプレートがデータの検索方法を変更しなければならないことを理解しています。バックボーン/アンダースコアテンプレート - レンダリング時になぜtoJSONを呼び出しますか?
なぜ&私はtoJSON()からどのようなメリットがありますか?典型的な例model.toJSON()
実施例
典型
をレンダリングするときに呼び出されます。注意すべきは、簡潔にするために、私はテンプレートを文字列リテラルとして入れていることに注意してください。
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template('<li><%=ToDoNote%></li>'),
render : function() {
var out= this.template(this.model.toJSON()); //<--JSON
$(this.el).html(out) }
return this;
}
}); //end view
アン別の方法
私はバックボーン0.9.2 &アンダースコア1.3.3コードを掘りました。バックボーンでは、model.toJSON()
は以下を実行することに気づいた:_.clone(this.attributes)
。テンプレートレンダリングエンジンの中で、私のコンパイルされたテンプレートは、渡されたデータの名前をobjとします。
これらのスニペットを見てから、属性のクローン作成は必要ないことに気付きました。代わりに、モデルに直接渡すことができます(ただし、テンプレートの構文の変更によって)。何かのような...二つの例を見てみると
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template('<li><%=obj.get('ToDoNote')%></li>'), //<--notice GET()
render : function() {
var out= this.template(this.model); //<-- look ma no json
$(this.el).html(result) }
return this;
}
}); //end view
、私はtoJSONを呼び出すことを考え出すことができる唯一の理由は、次のとおりです。
- は、ローカルに極悪非道なビュー
- からビューをモデルデータを保護(私の意見ではない良いアイデア)、
- ビューは、配列を使用して値にアクセスする必要のあるデータを修正/文字列構文(
obj[ namepart + someindex]
)
私の質問は、なぜtoJSON()
と呼んで、テンプレートでget()を使用するのではなく、プロパティを複製するヒットを得たのですか?
「クローニングのためのヒット」にしたくない、明らかに他のものと
model.toJSON()
の結果を、強化することがありますか? 'get 'を呼び出すことは無料だと思いますか? –@muistooshort - 無料ですか?いいえ。 'Get()'は 'this this.attributes [attr];'を返します。配列の検索は配列の複製よりも高速ですか?はい、両方のリソースと時間の側面から、しかし、私のポイントを逃す。 'toJSON()'を呼び出すことは、バックボーンコミュニティの集団的思考にはっきりと組み込まれています。なぜ私は不思議です。 – EBarr
「関数呼び出しとオブジェクトアクセスの繰り返し」と「1つのクローンとオブジェクトの繰り返しアクセス」があり、ベンチマーク結果が表示されないため、*はい*は単なる意見です(すべての回答がそうであるように、建設的な "投票)。すべてのビューがモデルやコレクションの直接マッピングになるわけではないので、 'toJSON'はより柔軟でテンプレートのノイズを減らします。 –