サクセスメソッドでバックボーンビューを2つの異なる場所に同時に追加しようとすると、2番目の追加のみが機能します。なぜなのかご存知ですか?
$(content).prepend(this.$el.append(this.template({ data: data })));
$(chat_window).prepend(this.$el.append(this.template({ data: data })));
サクセスメソッドでバックボーンビューを2つの異なる場所に同時に追加しようとすると、2番目の追加のみが機能します。なぜなのかご存知ですか?
$(content).prepend(this.$el.append(this.template({ data: data })));
$(chat_window).prepend(this.$el.append(this.template({ data: data })));
各 DOM ノードは正確に 0 個または 1 個の親ノードを持つことができ、1 個を超えることはありません。ノードをどこかに追加すると、そのノードは現在の親から削除され、新しい親に追加されます。ここで必要なのは、それぞれ独自の要素を持つ 2 つの異なるビュー インスタンスです。
el
html
バックボーンview
が生成する 1 つの要素に対応します。その html 要素に、別のバックボーンview
またはレンダリングされた html 天気をさらに追加できますtemplate
。
したがって、あなたの場合、el
が 2 回アタッチされている場合、最終的に dom ツリーに最後にアタッチされた場所にとどまります。複数の場所にアタッチする場合は、バックボーンを 2 回インスタンス化する必要があると思いますview
。
私の意見では、あなたが話しているビューは、その遠い親やいとこについて知っているべきではなく、むしろ「私は新しいコンテンツを持っています」というイベントをトリガーする必要があります。
ビューとそのhtml表現には違いがあるとはいえ、「。new-content-holder」を配置し、このセレクターをelとして渡すhtml内の2つの場所を取得するように、アプリを設計できます。作成時のあなたの見解の。次に、明示的にプログラミングしなくても、2つの場所が同時に更新されます。たとえば、長いリストのページ付けをリストの上下に表示したい場合などに、この手法を使用することがあります。
いくつかのhtml:
<div class="content">
<p>Recent comments</>
<ul class="new-content-holder"></ul>
</div>
<div class="chat-room">
Live feed
<ul class="new-content-holder">
<li>a chat message</li>
<li>another chat message</li>
</ul>
</div>
そして眺め
....
var MessageView = Backbone.View.extend({
template: _.template('<li class="chat-message"><%= message %></li>'),
prependData: function(data){
this.$el.prepend(this.template(data))
},
onMessage: function(message) {
this.prependData({message: message.data})
}
});
....
//And in a super controller of sorts :
var messageView = new MessageView(el: '.new-message-holder')
繰り返しになりますが、これは関心の分離としてはあまり適切ではありません...しかし、それがお役に立てば幸いです。
@Peter Lyons に同意します。同じノードを 2 つの要素に挿入することはできません。最終的に、ノードは新しい要素に移動します。方法の 1 つは、挿入する要素から HTML を取得し、同じ HTML を 2 回挿入することです。html は文字列であり、dom 要素ではないためです。要素内に何度でも追加できます。
これを試してください:
var html = this.$el.append(this.template({ data: data })).html();
$(content).prepend(html);
$(chat_window).prepend(html);
テンプレート内の要素に id を使用していないことを願っています。
PS: ユースケースが正確にはわかりません。