在Marionette 文档中CompositeView
,它描述appendHTML
了itemView
使用 jQuery 的append
.
使用类似的思路,如果我有两个ItemView
对象, aParent
和 a Child
,并且Parent
's 模板有一个空目标<div class="target"></div>
,我想在Child
其中注入 's 模板。html
我可以使用带有onRender
in的 jQueryParent
来执行此操作。
在 的整个Parent
生命过程中,我都想将 的内容清除或替换为其他内容.target
。如果我稍后想重新渲染(因为它可能会根据第一次渲染后的用户交互以不同方式渲染它的模板)Child
,我可以使用相同的逻辑:.target
- 渲染
Child
模板 - 使用 jQuery将
.target
's 的内容设置为Child
'sel
html
问题是,一旦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-RenderParent
,则Child
单击事件永远不会重新应用于Child
的模板的新呈现版本。如何确保Child
每次Child
呈现模板的事件时都会重新应用?
你可以在这里找到一个 jsFiddle 。