Backbone.js 使用主干网在CompositeView上渲染事件后。木偶
我有一个带搜索面板和结果数据收集的木偶合成视图 我想在以下情况下调用函数:Backbone.js 使用主干网在CompositeView上渲染事件后。木偶,backbone.js,marionette,Backbone.js,Marionette,我有一个带搜索面板和结果数据收集的木偶合成视图 我想在以下情况下调用函数: 此时将呈现搜索面板 集合尚未呈现 呈现集合时不应调用此函数 我是这样做的:(但是“afterRender”函数被调用了两次) 我该怎么做 =====================================编辑================================== 我是这样解决的,如果你有什么意见,请告诉我 // VIEW App.MyComposite.View = Backbone.Mario
- 此时将呈现搜索面板
- 集合尚未呈现
- 呈现集合时不应调用此函数
// VIEW
App.MyComposite.View = Backbone.Marionette.CompositeView.extend({
//INITIALIZE
initialize: function() {
//this.bindTo(this,'render',this.afterRender);
this.firstRender = true;
},
onRender: function () {
if (firstRender) {
//DO STUFF HERE..............
this.firstRender = false;
}
}
});
木偶网提供了一个内置于其所有视图中的
onRender
方法,因此您可以摆脱this.bindTo(this'render',this.afterRender)
调用:
// VIEW
App.MyComposite.View = Backbone.Marionette.CompositeView.extend({
// TEMPLATE
template: Handlebars.compile(templates.find('#composite-template').html()),
// ITEM VIEW
itemView: App.Item.View,
// ITEM VIEW CONTAINER
itemViewContainer: '#collection-block',
//INITIALIZE
initialize: function() {
// this.bindTo(this,'render',this.afterRender); // <-- not needed
},
onRender: function () {
// do stuff after it renders, here
}
});
但是,如果您有一些需要运行的特殊代码,并执行此选项未涵盖的某些操作,那么您必须加入一些自己的逻辑
CompositeView.extend({
onRender: function(){
if (this.collection && this.collection.length === 0) {
// do stuff here because the collection was not rendered
}
}
});
只需使用
onShow
功能
Backbone.Marionette.ItemView.extend({
onShow: function(){
// react to when a view has been shown
}
});
请提供有关事件绑定以及何时在初始化函数中调用render的更多详细信息:“this.bindTo(this,'render',this.afterRender)”。我不确定这是否正确,但我想做的是在渲染视图后调用“afterRender”函数谢谢你的回答。可能应该将“this.collection.length>0”更改为“this.collection.length==0”
CompositeView.extend({
onRender: function(){
if (this.collection && this.collection.length === 0) {
// do stuff here because the collection was not rendered
}
}
});
Backbone.Marionette.ItemView.extend({
onShow: function(){
// react to when a view has been shown
}
});