CompositeView中的SerializeData

时间:2012-07-04 11:53:17

标签: javascript-events backbone.js marionette

我需要将值传递给listView.template,以便了解有关collection.length的模板。
我认为一个选项是重新定义serializeData方法,以便以这种方式传递参数。

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.collection.on('reset', this.serializeData, this);
        this.collection.on('remove', this.serializeData, this);
        this.collection.on('add', this.serializeData, this);
    },

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

    // other codes
});

当我开始app时,尚未提取collection

1.a)collection.legth = 0
2.b)模板按预期获得has_tasks = false

2.a)取得collection.length is > 0后, 2.b)serializeData被调用,因此它放置has_tasks = true
2.c)模板似乎没有呈现,因为它维护has_tasks = false

任何想法都是因为2.c

2 个答案:

答案 0 :(得分:3)

最新的Marionette通过在视图上调用可选的templateHelpers来解决此问题,以便为视图提供其他上下文。此外,您的事件绑定不是Marionette友好的,因为它在卸载视图时不会自动解除绑定。所以你需要做的就是:

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.bindTo(this.collection, "add", this.render, this);
        this.bindTo(this.collection, "remove", this.render, this);
        this.bindTo(this.collection, "reset", this.render, this);
    },

    templateHelpers: function () {
        console.log(this.collection.length);
        return {
            has_tasks: this.collection.length > 0
        };
    },

    // other codes
});

但请注意,每次添加或删除项目时,您可能不希望重新渲染整个视图和所有子元素。更好的方法是仅更新显示的计数。例如:

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.bindTo(this.collection, "add", this.updateCount, this);
        this.bindTo(this.collection, "remove", this.updateCount, this);
        this.bindTo(this.collection, "reset", this.updateCount, this);
    },

    updateCount: function() {
        this.$('.count_span').html(this.collection.length);
    },

    // other codes
});

答案 1 :(得分:2)

我只想使用类似的东西:

var ListView = Marionette.CompositeView.extend({
  initialize: function () {
    this.bindTo(this.collection, 'reset', this.render)
  },
  serializeData: function () {
    return { has_tasks: this.collection.length > 0 }
  }
});

再次调用serializeData对您的视图没有影响。您需要再次渲染它才能显示新值(因为render将通过再次调用serializeData来获取数据。)

无论如何,将hasTask发送到模板有什么意义,因为您可以访问集合(以及它的长度)?