1

根据复合视图中的复合视图文档,事件resetremove并且add已经绑定到集合。

说了这么多,为什么我需要绑定reset事件来渲染我的CompositeView?

PS:
我正在使用Backbone.Marionette v0.9.1
更多细节请看代码(1),(2)
其实问题是关于serializeData,因为当从 initialEvents变量has_message调用渲染函数时设置为零。所以ul.messages没有在模板中定义。我应该如何解决它?


(1)

var CompositeView = Marionette.CompositeView.extend({

    template: CompositeTemplate,

    itemView: messageView,

    initialize: function () {
        this.collection = new MessageCollection();
        this.collection.fetch();

        this.bindTo(this.collection, 'reset', this.render);
        // deleting the previous line 
        // I cannot see the collection rendered after the fetch.
    },

    serializeData: function () {
        return {
            has_messages: this.collection.length > 0
        };
    },


    appendHtml: function (collectionView, itemView) {
        collectionView.$el.find('ul.messages').append(itemView.el);
    }

});

(2)

// Template


{{#if has_messages }}
    <!-- list messages -->
    <ul class="list messages"></ul>
{{else}}
    no messages
{{/if}}
4

1 回答 1

2

需要自己绑定“重置”是因为复合视图将重置事件绑定到集合渲染,而不是整个复合视图:

https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.compositeview.md#events-and-callbacks

您的 serializeData 函数的问题可能是由上下文问题引起的。您需要将事件绑定更改为此:

this.bindTo(this.collection, 'reset', this.render, this);

这会将视图的上下文与事件绑定。

于 2012-07-20T19:51:09.047 回答