2

我有一个骨干木偶复合视图如下

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
  • 渲染

根据骨干木偶的预期代码流是

  • 4 附加HTML
  • 渲染
  • 展出

这是怎么发生的?

4

2 回答 2

2

那可能是因为您在初始化函数中获取数据?提取会导致 collection.reset() ,因此您的复合视图将按照文档中的说明重新呈现:

“复合视图的模型和集合将在以下条件下重新呈现自己:

  • 当集合的“重置”事件被触发时,它只会重新呈现组合内的集合,而不是包装模板......”

事实上,由于 Javascript 的异步性质,当您分配给您this.collection的值时,myVideos并不能保证它已经完成了它的工作。fetch()

当您调用 VideosView 时,请尝试类似的操作:

var myVideos = new VideoCollection();

myVideos.fetch({success:function(){

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

当然,现在您可以取消初始化功能。

于 2012-10-25T12:52:18.190 回答
0

你用的是什么版本的木偶?在 v1.0.0-beta1 中有一个错误导致此问题:https ://github.com/marionettejs/backbone.marionette/issues/287

它已在 v1.0.0-beta2 中修复(在撰写本文时,最新版本是 v1.0.0-beta3)

于 2012-10-25T14:44:02.483 回答