概要:モデルデータを使用してビュー属性を動的に設定する
http://jsfiddle.net/5wd0ma8b/
var View = Backbone.View.extend( {
attributes : function () {
return {
class : this.model.get( 'item_class' ),
id : this.model.get( 'item_id' )
};
}
} );
var item = new View( {
model : new Backbone.Model( {
item_class : "nice",
item_id : "id1"
} )
} );
この例では、BackboneがDOM要素を生成することを許可していることを前提としています。
このattributesメソッドは、ビューコンストラクターに渡されたプロパティが設定された後に呼び出され(この場合model)、Backboneが作成する前にモデルデータを使用して属性を動的に設定できますel。
他のいくつかの回答とは対照的に、ビュークラスに属性値をハードコーディングせず、モデルデータから動的に設定します。render()属性値を設定するまで待機しません。render();を呼び出すたびに属性値を繰り返し設定するわけではありません。DOM要素に不必要に手動で属性値を設定しません。
呼び出し時にクラスBackbone.View.extendまたはビューコンストラクター(例new Backbone.View)をclassName設定する場合は、DOMプロパティ名を使用する必要がありますが、attributesハッシュ/メソッドを介して設定する場合は(この例のように)、属性名を使用する必要があることに注意してくださいclass。
バックボーン0.9.9以降:
ビューを宣言すると... el、tagName、idとclassNameあなたはそれらの値は、実行時に決定することにしたい場合は、今、関数として定義することができます。
図のようなattributes方法を使用する代わりにそれが役立つ状況がある場合に備えて、これについて言及します。
既存の要素を使用する
既存の要素を使用している場合(たとえばel、ビューコンストラクターに渡す場合)...
var item = new View( { el : some_el } );
...その後attributes、要素には適用されません。必要な属性がすでに要素に設定されていない、またはあなたのビュークラスと別の場所にそのデータを複製したくない場合は、追加することもinitialize適用されるビューのコンストラクタにメソッドをattributesしますel。このようなもの(を使用jQuery.attr):
View.prototype.initialize = function ( options ) {
this.$el.attr( _.result( this, 'attributes' ) );
};
の使用法el、レンダリング、ラッパーの回避
私が見たほとんどの例では、ビューのelは意味のないラッパー要素として機能し、その中に「セマンティック」コードを手動で記述する必要があります。
view.el「無意味なラッパー要素」である必要がある理由はありません。実際、それはしばしばDOM構造を壊します。たとえば、ビュークラスが<li>要素を表す場合は、<li>-としてレンダリングする必要があります。<div>または他の要素としてレンダリングすると、コンテンツモデルが破損します。あなたはおそらく正しく(のようなプロパティを使用して、ビューの要素を設定するに集中したいと思うtagName、classNameとid)と、そのレンダリングのコンテンツをその後。
バックボーンビューオブジェクトをDOMと相互作用させる方法のオプションは広く開かれています。2つの基本的な初期シナリオがあります。
要素のコンテンツを生成するには、さまざまな方法があります(例のようにリテラル文字列を設定し、Mustache、Handlebarsなどのテンプレートライブラリを使用します)。elビューのプロパティをどのように使用するかは、何をしているかによって異なります。
既存の要素
レンダリングの例は、ビューのインスタンス化を表示していなくても、ビューに割り当てている既存の要素があることを示しています。その場合、要素がすでにドキュメントに含まれている場合は、次のようにすることができます(の内容を更新しますがel、elそれ自体は変更しないでください)。
render : function () {
this.$el.html( "Some stuff" );
}
http://jsfiddle.net/vQMa2/1/
生成された要素
既存の要素がなく、Backboneが要素を生成できるようにしたとします。あなたはこのようなことをしたいかもしれません(しかし、あなたの見解がそれ自身の外の何かについて知ることに責任がないように物事を設計する方が良いでしょう):
render : function () {
this.$el.html( "Some stuff" );
$( "#some-container" ).append( this.el );
}
http://jsfiddle.net/vQMa2/
テンプレート
私の場合、次のようなテンプレートを使用しています。
<div class="player" id="{{id}}">
<input name="name" value="{{name}}" />
<input name="score" value="{{score}}" />
</div>
<!-- .player -->
テンプレートは完全なビューを表します。言い換えれば、テンプレートの周りにラッパーはありません-div.player、ビューのルートまたは最も外側の要素になります。
私のプレーヤークラスは次のようになります(非常に単純化された例を使用render()):
Backbone.View.extend( {
tagName : 'div',
className : 'player',
attributes : function () {
return {
id : "player-" + this.model.cid
};
},
render : function {
var rendered_template = $( ... );
this.$el.empty().append( rendered_template.children() );
}
} );