あなたNoteListView
はその外に何も書かないでしょうel
(例:http://jsfiddle.net/ambiguous/cFvX2/)ので、あなたの問題は別の場所にあります。
私の推測では、あなたはこれと同等のことをしていたと思います:
var v = new App.view.NoteListView;
$('#notes').html(view.render().el);
#notes
これにより、テーブルの内容が<tbody>
(つまりNoteListView
)だけに完全に置き換えられel
ます。
あなたの問題を回避する方法はいくつかあります。呼び出しrender
て、返されるものを無視することができます。
var v = new App.view.NoteListView;
v.render();
それは私の最初のデモフィドルがやったことです。
または、の代わりにid
andtagName
el
を使用できます。
App.view.NoteListView = Backbone.View.extend({
id: 'notesTableBody',
tagName: 'tbody',
initialize:function () {
this.model.bind("reset", this.render, this);
},
render:function (eventName) {
_.each(this.model.models, function (note) {
$(this.el).append(new App.view.NoteListItemView({model:note}).render().el);
}, this);
return this;
}
});
そしてappend
、ビューのel
to $('#notes')
:
var v = new App.view.NoteListView;
$('#notes').append(v.render().el);
デモ: http://jsfiddle.net/ambiguous/HTAkM/
呼び出し元に次を指定させることもできますel
。
App.view.NoteListView = Backbone.View.extend({
initialize:function () {
this.model.bind("reset", this.render, this);
},
render: function(eventName) {
_.each(this.model.models, function (note) {
$(this.el).append(new App.view.NoteListItemView({model:note}).render().el);
}, this);
return this;
}
});
そして、の戻り値を気にせずにrender
:el
render
var v = new App.view.NoteListView({ el: $('#notesTableBody') });
v.render();
デモ: http://jsfiddle.net/ambiguous/2Ptkp/
私がここにいる間は、$(this.el)
もうその必要はありません。Backbone の最近のバージョンでは、this.$el
次のようなビューが提供されています。
$エル view.$el
ビューの要素のキャッシュされた jQuery (または Zepto) オブジェクト。常に DOM 要素を再ラップするのではなく、便利なリファレンスです。
ビューがコレクションをラップしている場合は、this.collection
代わりに次を使用する必要がありますthis.model
。
new SomeView({ collection: some_collection })
ビューはcollection
オプションを次のように特別にmodel
扱います。
コンストラクター/初期化 new View([options])
[...] 渡された場合、ビューに直接アタッチされる特別なオプションがいくつかあります: model
、collection
、el
、id
、className
、tagName
およびattributes
。
バックボーン コレクションにはいくつかの Underscore メソッドも混在しているため、次のように言う必要はありません。
_.each(some_collection.models, function(m) { ... });
コレクションで直接呼び出すことができますeach
:
some_collection.each(function(m) { ... });
また、"reset"
イベントにバインドしている場合:
this.model.bind("reset", this.render, this);
さらに何かを追加する前に、render
をクリアする必要があるでしょう。el
render: function() {
this.$el.empty();
this.collection.each(function(note) { ... });
}
そうしないとempty
、el
おそらくその内容を新しいものに置き換えるつもりであるときに、さらに多くのものを追加することになります。