Backbone.jsでの2回目のレンダリングの後、イベントが発生しないのはなぜですか?
-
25-10-2019 - |
質問
親と複数の子供の見解を持つBackbone.jsでアプリを作成しています。子ビューには、聴いて機能を実行するリンクが含まれています。
親は、すべての子供の見解のリストを保存します。レンダリング関数では、独自のHTMLの計算が完了した後、次のことを行います。
$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
$('.children', this.el).append(this.views[i].render().el);
}
回答:問題は、レンダリング中にリンクを作成していたことでした。 IEでは、最初のレンダリング(INITから呼び出されました)で、イベントはリンクにうまくバインドされています。ただし、レンダリングのすべてのコールが要素全体を再現するため、新しいリンクにはハンドラーが縛られていませんでした。これは、追加の@TOM TUソリューションを介して解決されました this.delegateEvents()
レンダリングに
解決
おそらくJQueryを使用しています remove
どこかでビューからサブビューを削除するために機能します - それは要素(this.el)にバインドされたすべてのイベントを自動的に削除します - events
物体。どちらかを使用できます this.delegateEvents()
テンプレートをレンダリングした後のサブビューのレンダリングのメソッド events
オブジェクトまたはjqueryを使用します detach
代わりに、イベントバインディングを削除せずにDOMから要素を削除する方法(リンク)。 delegateEvents
方法は非常に費用がかかるため、お勧めします detach
サブビューの長いリストをレンダリングしている場合に再利用する要素を削除する方法 - それがほんの数ビューである場合は無関係です。
他の可能性は、あなたが設定したことです events
オブジェクトが間違っている - 提供されたコードの量からはわかりにくいが、最初のコードに賭けた。
他のヒント
本当に一般的な課題です。この質問の将来の発見者のために、ビューレンダリングに関する素晴らしい記事を次に示します。
delegateEventsがいつでもサブビューのイベントを再バインドするように呼び出されることを確認する必要があります。html()runs。また、BackboneのSetelementはすでにDelegateEventsを呼び出しているため、迅速な解決策は次のようになります...
http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/