2012-04-25 8 views
7

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()を使用するのではなく、プロパティを複製するヒットを得たのですか?

+0

「クローニングのためのヒット」にしたくない、明らかに他のものとmodel.toJSON()の結果を、強化することがありますか? 'get 'を呼び出すことは無料だと思いますか? –

+0

@muistooshort - 無料ですか?いいえ。 'Get()'は 'this this.attributes [attr];'を返します。配列の検索は配列の複製よりも高速ですか?はい、両方のリソースと時間の側面から、しかし、私のポイントを逃す。 'toJSON()'を呼び出すことは、バックボーンコミュニティの集団的思考にはっきりと組み込まれています。なぜ私は不思議です。 – EBarr

+0

「関数呼び出しとオブジェクトアクセスの繰り返し」と「1つのクローンとオブジェクトの繰り返しアクセス」があり、ベンチマーク結果が表示されないため、*はい*は単なる意見です(すべての回答がそうであるように、建設的な "投票)。すべてのビューがモデルやコレクションの直接マッピングになるわけではないので、 'toJSON'はより柔軟でテンプレートのノイズを減らします。 –

答えて

12

たぶん以下は理にかなって:

  1. は、補間の代わりに評価する取るために大きなコストです。したがって、テンプレートのバージョンはで、実際にはtoJSon()を呼び出して評価を使用するよりもはるかに低速です。

  2. ロジックはテンプレートではなくビューに属します。テンプレートにjsコード(および補間の必要性)を導入することは、必要な場合にのみ行う必要があります。

  3. model.toJSON()の代わりにmodel.attributesを渡す必要があると主張できます。私はそうしない理由は、テンプレートにモデルの属性を変更させないようにするためです。また、あなたは通常、あなたがmodel.attributes

+0

うまく言った。たくさんの意味があります。 – EBarr

+2

'model.toJSON()'を使うことは、ビューに対して勧告されていることに注意してください...レンダリングではなくモデルをシリアライズするためのものです。あなたが提案したように 'model.attributes'を渡すべきです。 https://github.com/jashkenas/backbone/issues/2134 – Cobby

+0

'toJSON()'や '_.clone()'を使用しても、モデルの属性を変更できないことはありません。なぜなら、クローンメソッドは "浅い複製されたオブジェクトまたは配列は複製されずに参照によってコピーされます。 (http://underscorejs.org/#clone) 'model.attributes'を使うことをお勧めしますが、いずれの場合でもテンプレートからモデルを変更するべきではないということに注意してください。 – gfullam

2

Backbone.jsの開発者はあなたが望む任意のテンプレートエンジンを使用でき、多くのテンプレートエンジンは単純なJavaScriptオブジェクトであるではなくバックボーンモデルを使用する可能性があるためです。

+1

良い点。しかし、私は具体的には、この戦略*をアンダースコアテンプレート*に選択する理由/理由について話しています。 – EBarr