评论时间长了,所以我会产生第二个答案来比较。
首先,我觉得“完成”,“未完成”完全是项目模型属性,将被持续。或者,如果你的物品被许多用户所拥有,每个用户都有自己的“已完成”“未完成”状态,那么该物品将有一个completedState子模型或其他东西。要指出的是,虽然@fguillen为您提供了两种可能的解决方案,但我也更愿意以他的第二种方式来完成这一任务,模型包含属性和执行大部分工作的按钮/视图。
对于我来说,模型没有意义为此拥有自己的自定义事件。听起来像一个过滤器按钮只需要处理提供适当的意见。 (显示哪些项目)因此,我只是让button元素调用一个函数,它可以或多或少地直接在集合上运行过滤器。
event: {
'click filterBtnCompleted':'showCompleted'
},
showCompleted: function(event) {
var completedAry = this.itemCollection.filter(function(item) {
return item.get('completed');
});
// Code empties your current item views and re-renders them with just filtered models
}
我倾向于弄走这几样方便的过滤功能集合中的自己,让我可以叫:
this.ItemCollection.getCompleted(); // etc.
在模型中留下这些属性,忽视他们对你的服务器是好的。尽管如此,它听起来像是你想要坚持的属性。
还有一件事,你说用简单的非骨干国家牺牲事件。 (咧嘴:-)不是这样!您可以轻松扩展任何对象以具有Backbone.Event功能。
var flamingo = {};
_.extend(flamingo, Backbone.Events);
现在你可以有火烈鸟触发器,并听取事件像其他任何事情!
编辑:解决路由器>查看数据往来------------------- //
我怎么做我的路由器可能不是什么你这样做,但我把我的appView作为选项传入路由器。我在appView中有一个名为showView()的函数,它可以创建子视图。因此,我的路由器可以直接访问我正在处理的视图。
// Router
initialize: function(options) {
this.appView = options.appView;
}
在我们的例子中,它可能是itemsView需要过滤来呈现完成的项目。注意:我也有一个showView()函数来管理子视图。您可能只是在您的场景中直接使用appView。
所以当像/ items /#完成的路由被调用时,我可能会这样做。
routes: {
'completed':'completed'
},
completed: {
var itemsView = ItemCollectionView.create({
'collection': // Your collection however you do it
});
this.appView.showView(itemsView);
itemsView.showCompleted(); // Calls the showCompleted() from View example way above
}
这有帮助吗?
这是一个很好的答案。谢谢。 –