我需要向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条答案
按热度按时间g2ieeal71#
最新的Marionette解决了这个问题,它在视图上调用了一个可选的
templateHelpers
来为视图提供额外的上下文。另外,您的事件绑定不是Marionette友好的,因为当视图卸载时,它不会正确地自动绑定。因此,您需要在视图中做的就是:但是,请注意,您可能不希望在每次添加或删除项时都重新呈现整个视图和所有子元素。更好的方法是只更新显示的计数。例如:
wecizke32#
我会简单地使用类似以下的语句:
再次调用serializeData不会对视图产生任何影响。您需要再次呈现它以显示新的值(因为
render
将通过再次调用serializeData
来获取数据)。无论如何,既然可以访问集合(以及它的长度),那么将
hasTask
发送到模板有什么意义呢?