防止Marionette CompositeView渲染,直到获取完成

时间:2015-09-02 17:24:40

标签: javascript backbone.js marionette

我遇到一个问题,即在我的Marionette CompositeView中以自动方式调用渲染这是正确的,问题是我在initialize中获取集合数据并希望在此时出现渲染发生了。目前我在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 个答案:

答案 0 :(得分:0)

首先,我不相信有一种方法可以完全停止渲染,但你有很多方法可以解决这个问题。

选项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 :(如果使用模板)

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

实际上我需要更多信息。视图是如何创建的?这是一个地区吗?它是动态添加的吗?你使用模板吗?你能提供更多代码吗?