我需要将值传递给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
?
答案 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
发送到模板有什么意义,因为您可以访问集合(以及它的长度)?