7

model.ToJSON()backbone.js とコンパニオン テンプレート エンジンをアンダースコアで使用すると、ほとんどの例で を単に渡すのではなく、レンダリング時に呼び出すことに気付きましたmodel。テンプレートでデータを取得する方法を変更する必要があることを理解しています。

なぜ、そして 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). テンプレート レンダリング エンジン内で、コンパイル済みのテンプレートは、passed-data 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

2 つの例を見ると、toJSON を呼び出す唯一の理由は次のとおりです。

  • 悪意のあるビューからモデル データを保護する
  • ビューはローカルでデータを変更します (私の意見では良い考えではありません)。
  • ビューは、配列/文字列構文を使用して値にアクセスする必要があります( obj[ namepart + someindex])

toJSON()私の質問は次のとおりです。テンプレートで get() を使用するだけでなく、プロパティのクローンを作成するために呼び出してヒットするのはなぜですか?

4

2 に答える 2

12

おそらく、次のことが理にかなっています。

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

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

  3. クローンmodel.attributesを回避するのではなく、パスする必要があると主張する人もいるかもしれません。model.toJSON()そうしない理由は、テンプレートがモデルの属性を変更できないようにするためだと思います。さらに、通常は の結果model.toJSON()を他のもので拡張したい場合がありますが、これは明らかにmodel.attributes

于 2012-04-26T18:54:20.897 に答える
2

考えられる理由は、Backbone.jsの開発者が任意のテンプレートエンジンの使用を許可しており、多くのテンプレートエンジンがBackboneモデルではなく単純なjavascriptオブジェクトで動作するためです。

于 2012-04-25T19:17:58.490 に答える