2013-03-21 5 views
15

しかし、私は機能を書いています、このように言ってはるかに簡単なようで、実際のモデルをwhitin :backbone.jsモデル内のモデル属性にアクセスする - this.attribute VS this.get( 'attribute')? BACKBONE.JSモデルの属性が</p> <pre><code>this.set({ attributeName: attributeValue }) // accessing the value this.get('attributeName'); </code></pre> <p>を言うことによって多少のプライベートメンバ変数として宣言することになっている私の理解から

this.attributeName = attributeValue; 
// accessing the value 
this.attributeName; 

また、後者のバージョンは、backbone.jsのイベント管理を経由しないため、処理が高速になると思われます。

私はあなたがプロのどのようにモデルで主に内部的に使用される属性を使っているのだろうかと思っていました。これらは、実際には外部から遮蔽されたビットであることが望ましい属性であるため、後者の例のように公開されている可能性があります。メソッドを取得して設定していないbackbone.jsビューの例を見ていたら、2番目の例のようにうまくいくようです。モデル内でコーディングするときに、get/set(属性)またはthis.attributeを使用するときに、親指のルールがありますか?あるいはこれをより明確にするモデルの例でしょうか?

+0

なぜあなたはバックボーンイベント管理を避けたいでしょうか? Backbone.Modelの内部または外部で更新されていても、特定の属性をリッスンしているビューが存在する可能性がありますか? – neebz

+1

私は、私のアプリケーションで、例えば16ミリ秒ごとにいくつかのモデル属性を更新すると、毎回すべてのイベントを起動するのは良い考えではないと思ったのですか?私が遭遇したほとんどの例は、Todo-listやそれ自体を頻繁に更新しないものに関するものです。 – torno

+2

プライベートモデルのデータについては、バックボーンの 'Model'オブジェクトの管理領域に置くのではなく、' this._propName'を実行するだけです。 – WiredPrairie

答えて

54

ときあなたは、モデルのデータにアクセスするためにgetsetを使用する必要がありmodel.get(property)model.set(...)

を使用します。これは、fetchを使用して取得され、saveを使用して保持される、モデルのシリアライズされた表現の一部であるすべての属性を意味します。

ときmodel.attributes.property

を絶対に使用しないように。

model.attributesオブジェクトに直接アクセスするのではなく、常にget、特にsetを使用する必要がありますが、これについては相反する意見があります。私は、modelと契約者の間に契約があると信じており、消費者はchangeイベントを使用してモデルのデータに対する変更をコンシューマに通知できることを保証します。内部属性オブジェクトを直接変更すると、イベントは送信されず、このコントラクトは破損します。バックボーンイベントは非常にです。特に、リスナーが接続されていない場合は、あなたの過度の最適化のメリットがありません。

getの代わりに属性に直接アクセスすることは、それ自身では全く無害ですが、避けるべきですので、attributesオブジェクトは完全に非公開と見なすことができます。

イベントの変更を防ぐためには、silent:trueオプション:model.set({key:val}, {silent:true})を使用することができます。これは前述の契約を破ってしまい、Backbone独自のドキュメントでも次のような警告が出されます。

これはまれなことではありません。あなたのイベントコールバックのオプションの特定のフラグを見て、無視して選択すると、通常よりうまくいくでしょう。

データないmodel.property

任意のプロパティを使用する場合、すなわち、一時的な状態変数、計算の性質等は、モデルエンティティに直接取り付けることができるに。これらのプロパティは、一時的かつ推移的であるとみなす必要があります。モデルの初期化時または存続期間中に再作成できますが、パブリックであれプライベートであれ、永続化しないでください。一般的な命名規則は次のように_文字でプライベートプロパティの前に付けることです。

this._privateProperty = 'foo'; 
this.publicProperty = 'bar'; 
+0

答えは初心者にはお勧めできません。しかし、大規模なデータセットで動作するより複雑なプロジェクトで作業する場合は、model.attributesを使って作業する必要があります。なぜなら、オーバーヘッドでset/getメソッドを使用するよりもずっと速いからです。 –

+0

@ jiriはいくつかのperfテストでそれを実証できますか? – backdesk

2

は不完全な答えはありません。

場合によっては、モデル属性のコレクションにアクセスする必要があります。

var attributesNames = ['foo', 'bar', 'baz']; 
var attributes = _(attributesNames).map(function(attr) { return model.get(attr); }); 

callSomeUtilityMethod(attributes); 

:これを実行するための便利な方法は、下に、一つの代替を考えてみましょうmodel.attributesに

にアクセスすることである

など、出力のためにそれらをフォーマットし、属性にCALCSを実行するユーティリティメソッドを考えてみましょう2つの問題:

  • "attributeNames"コレクションにカップリングが導入されました。そのリストが変わるとどうなるでしょうか?
  • 名前/値の関連付けが失われました。上記の地図を書き直すことはできましたが、それはより多くの作業になります。このシナリオでは

が、それはこのような何かをはるかに便利だ:

callSomeUtilityMethod(model.attributes); 
+2

私はこれを行うことはお勧めしません。内部属性を公開するだけでなく、モデルの内部状態を表すことがわからない可能性のある別のメソッドに公開しています。 'callSomeUtilityMethod'メソッドがそれを引数として受け取ったオブジェクトを変更すると、(偶然にも)モデルの状態も変更されます。 この場合、 'callSomeUtilityMethod(model.toJSON());'を使うとモデルの属性を効果的に複製し、デバッグの難しい問題を回避できます。 – jevakallio

+0

@jevakallioモデルにプリミティブのみが含まれている場合は問題ありません。あなたのモデルに、あなたが使用している機能に変更可能なオブジェクトが含まれていると、それほどうまくいきません。 –

+0

目白押し:これはバグではなく機能です。 Caveat emptor(したがって、 "Never is incomplete")。潜在的により深刻な問題は、あなたがあなたのモデルget()をオーバーライドしていつも巧妙な "魔法"をするときです。モデルにプリミティブが含まれていても、 –

関連する問題

 関連する問題