のMarionette ドキュメントではCompositeView
、jQueryの.appendHTML
itemView
append
同様の考え方で、 aと aの 2 つのItemView
オブジェクトがあり、のテンプレートに空のターゲットがある場合、のテンプレートを内部に挿入したいと考えます。これを行うには、 jQueryをinと共に使用できます。Parent
Child
Parent
<div class="target"></div>
Child
html
onRender
Parent
の生涯を通じて、Parent
の内容を洗い流すか、別のものに置き換えたいと考えて.target
います。Child
後で再レンダリングしたい場合.target
(最初のレンダリング以降のユーザーの操作に基づいてテンプレートが異なる方法でレンダリングされる可能性があるため)、同じロジックを使用できます。
Child
テンプレートをレンダリングする- の
.target
内容をjQuery でに設定するChild
el
html
問題は、この 2 番目のレンダリングChild
が発生すると、ビューからのイベントChild
が失われたように見えることです。
これが私が説明していることの具体的な例です:
HTML
<script type="template" id="parent">
<p><a class="re-render" href="javascript://">Re-Render</a></p>
<div class="target"></div>
</script>
<script type="template" id="child">
<p><a href="javascript://">The Link</a></p>
</script>
<div id="main"></div>
Javascript
var Views = {};
Views.Child = Backbone.Marionette.ItemView.extend({
template: '#child',
events: {
'click a': 'changeBg'
},
changeBg: function() {
this.$el.css('background-color', '#'+Math.floor(Math.random()*16777215).toString(16));
}
});
Views.Parent = Backbone.Marionette.ItemView.extend({
template: '#parent',
childView: undefined,
ui: {
target: '.target'
},
events: {
'click .re-render': 'onRender'
},
initialize: function() {
this.childView = new Views.Child();
},
onRender: function() {
this.childView.render();
this.ui.target.html(this.childView.el);
this.childView.$el.css('background-color', 'transparent');
}
});
var App = new Backbone.Marionette.Application();
App.addRegions({
mainRegion: "#main"
})
App.mainRegion.show(new Views.Parent());
最初にリンクをクリックするとChild
うまくいきます。でRe-RenderがクリックされるとParent
、クリック イベントがのテンプレートのChild
新しくレンダリングされたバージョンに再適用されることはありません。テンプレートがレンダリングされるたびに、テンプレートのイベントが再適用されるようにするにはどうすればよいですか?Child
Child
Child
このための jsFiddle はこちらにあります。