复合视图绑定的初始事件

时间:2012-07-20 13:51:18

标签: javascript backbone.js marionette

根据Composite View documentation的说法 复合查看事件resetremoveadd已绑定到集合。

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

P.S .:
我正在使用Backbone.Marionette v0.9.1
有关详细信息,请参阅代码(1),(2)
实际上问题是关于serializeData, 因为从initialEvents调用render函数时,变量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}}

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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