Javascript 在提取完成之前防止木偶合成视图渲染
我遇到了一个问题,在我的Javascript 在提取完成之前防止木偶合成视图渲染,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,我遇到了一个问题,在我的木偶合成视图中自动调用render,这是正确的,问题是我在初始化中获取集合数据,并希望在渲染发生时显示这些数据。目前,我正在重新渲染的fetch的done方法中运行this.render(),但这会导致问题,因为现在每个模型有2个视图。有谁能推荐我如何正确地防止这种初始渲染或防止重复视图。1条目将输出view1和view2 JS CompositeView initialize: function() { var self = this;
木偶合成视图中自动调用render,这是正确的,问题是我在初始化中获取集合数据,并希望在渲染发生时显示这些数据。目前,我正在重新渲染的fetch的done方法中运行this.render()
,但这会导致问题,因为现在每个模型有2个视图。有谁能推荐我如何正确地防止这种初始渲染或防止重复视图。1条目将输出view1和view2
JS CompositeView
initialize: function() {
var self = this;
this.teamsCollection = new TeamsCollection();
this.teamsCollection.fetch().done(function() {
self.render();
});
},
首先,我不相信有一种方法可以完全停止渲染,但是你有很多方法可以解决这个问题
选项1:首先获取数据,然后创建视图,完成后将数据传递到视图中
//before view is rendered, this is outside of your view code.
var teamsCollection = new TeamsCollection();
teamsCollection.fetch().done(function(results) {
var options = {res: results};
var myView = new CompositeView(options);
myView.setElement( /* your element here */ ).render();
});
备选案文2:
// don't use render method, use your own
initialize: function() {
var self = this;
this.teamsCollection = new TeamsCollection();
this.teamsCollection.fetch().done(function() {
self.doRender();
});
},
render: function(){}, // do nothing
doRender: function(){
// override render here rather than using default
}
选项3:(如果使用模板)
//如果您有一个模板,那么您只需在初始化时传入一个空白模板即可
//然后,在提取完成后,替换模板并再次调用render
初始化:函数(){
var self=这个;
此.template="谢谢,是的,这是动态创建的,并且使用了区域!我确实使用了模板,并且喜欢你选项3的想法。我将用更多的信息更新我的问题。事实上,第三个选项并没有摆脱这样一个事实,即每个模型都会创建两个视图,因为每个模型仍会进行两次渲染?好吧,我希望我的答案至少为您指明了正确的方向。但使用区域意味着您希望木偶为您自动渲染东西,所以您唯一的选择是渲染不可见的东西,并且使用一个不做任何事情的类(首先渲染)。然后在获得数据后,切换类和模板并重新渲染。
// if you have a template, then you can simply pass in a blank one on initialization
// then when the fetch is complete, replace the template and call render again
initialize: function() {
var self = this;
this.template = "<div></div"; // or anything else really
this.teamsCollection = new TeamsCollection();
this.teamsCollection.fetch().done(function() {
self.template = /* my template */;
self.render();
});
},