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();
    });
},