Backbone.js puppet 合成视图on渲染执行两次

3hvapo4f  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(140)

我有一个 Backbone puppet 合成视图如下

VideosView = Backbone.Marionette.CompositeView.extend({
        template : videosTpl,
        id : "video",
        itemView : VideoView,

        initialize : function() {
                 //fetching the collection 
            var myVideos = new VideoCollection();
            myVideos.fetch();
            this.collection = myVideos;
        },
        appendHtml : function(collectionView, itemView) {
            //appending each videos to the video list
            console.log("appendHtml");
            collectionView.$("ul").append(itemView.el);

        },
        onRender: function(){
            console.log("onRender");

        },
        onShow: function(){
            console.log("onShow");

        }
    });

控制台中的输出为

  • 渲染
  • 显示
  • 4个附件Html
  • 渲染

根据 Backbone puppet 的预期代码流是

  • 4个附件Html
  • 渲染
  • 显示

怎么会这样?

x0fgdtte

x0fgdtte1#

这可能是因为您正在初始化函数中获取数据?获取会导致collection.reset(),因此您的Composite视图将按照文档中的说明重新呈现:
“复合视图的模型和集合将在以下条件下重新呈现自身:

  • 当集合的“reset”事件被激发时,它只会重新呈现组合中的集合,而不会呈现 Package 模板...”

事实上,当您将myVideos的值赋给this.collection时,由于Javascript的异步特性,您不能保证fetch()已经完成了它的工作。
在调用VideosView时,请尝试类似的操作:

var myVideos = new VideoCollection();

myVideos.fetch({success:function(){

    var View = new VideosView({collection:myVideos});
}});

当然,现在您可以清空初始化函数。

g6ll5ycj

g6ll5ycj2#

您使用的是哪个版本的Marionette?在v1.0.0-beta1中有一个错误导致了这个问题:https://github.com/marionettejs/backbone.marionette/issues/287
它在v1.0.0-beta2中得到了修复(在撰写本文时,最新版本是v1.0.0-beta3)

相关问题