2011-10-25 3 views
22

私はモデル投稿とコレクション投稿を持っています。 <select id="multi" multiple="multiple">にすべての投稿のリストを含むフォームを作成したいと考えています。だから、このテンプレートだけで#multi内にPostViewレンダリングを作成する必要があります:Backbone.jsレンダリングでdivで折り返しをオフにする

<option value=""><%= title %></option> 

最後に私はdivでラップします。このテンプレートを<div>でラップしない方法はありますか?

答えて

32

ビュー(クラス内またはインスタンス化中)にel(またはtagName)を定義しないと、ビューはdivタグ内に配置されます。 http://documentcloud.github.com/backbone/#View-el

var PostView = Backbone.View.extend({ 
    tagName: 'option' 
}); 

UPDATE

v0.9.0を起動し、バックボーンはこれを成し遂げるためにview.setElement(要素)を持っています。

var PostView = Backbone.View.extend({ 
    initialize: function() { 
     var template = _.template('<option value=""><%= title %></option>'); 
     var html = template({title: 'post'}); 
     this.setElement(html); 
    } 
}); 
+1

私はこのアプローチも試みましたが、この

+0

jqueryを使用して '$(this.el).attr( 'value'、 'something');' – kreek

+4

または 'this.el.value = 'something''を設定することができます。それは必要です:) –

18

ビューは、あなたのHTMLをラップしたくない場合は、あなたはいくつかのことを行う必要があるでしょう:

  1. が新しいel
  2. this.el完全
  3. コールdelegateEventsを交換してください
render: function(){ 
    var html = "some foo"; 
    this.el = html; 
    this.delegateEvents(this.events); 
} 

骨格がを生成するためまたは他のタグ(ビューの設定ではtagNameに基づいています)を完全に置き換える必要があります。それは簡単です。しかし、そうすると、BackboneはjQueryのdelegateをワイヤリングするために使用するため、宣言されたイベントは失われます。宣言されたイベントを再び有効にするには、delegateEventsに電話し、イベント宣言を渡してください。

あなたのview.elは、あなたが望む<option>というタグになります。

+0

ご協力ありがとうございました。私は将来のプロジェクトであなたのアドバイスを使用します/ – BazZy

+0

delegateEventsにthis.eventsを渡す必要はありません。デフォルトになります。 – troynt

+8

これは、最新のバージョンのBB - [view.setElement(html)](http://documentcloud.github.com/backbone/#View-setElement)にあります。 – zihotki

4

バージョン0.9.0では、Backboneはこの操作を処理するためにview.setElement(element)を導入しました。

関連する問題