如果我在我的收藏中定义了一个过滤器,如下所示:
filterByEveryday: function(){
return this.models.filter(
function(c) {
return c.Everyday == true;
})
}
如何在我的路线中使用该过滤器来选择日常早餐?
我的路线看起来像这样(目前取出所有的食物)
products: function(type){
console.log('product' + type );
Breakfast.foods = new Breakfast.Collections.Foods()
new Breakfast.Views.Foods({ collection: Breakfast.foods });
Breakfast.foods.fetch();
console.log(Breakfast.foods.filterByEveryday().length)
},
这里有一些问题 1. Breakfast.foods.filterByEveryday()。长度返回0.即使我将测试更改为true。我想我使用它错了? 2.路由中似乎有很多逻辑,这对骨干来说是否正常?看起来它应该在视图中,但我不确定如何重构它并且有每个路由过滤器 3.尝试将过滤后的集合传递给视图,如下所示:
collection: Breakfast.foods.filterByEveryday()
给了我
TypeError: Object [object Array] has no method 'bind'
我想这也错了。
答案 0 :(得分:3)
我会回答你的第一个和第三个问题。关于逻辑,我会说你做你想要的;)记住你做的方式,如果有人导航两次到同一条路线,你会收集你的收集两次等等......
让我们开始吧。您可能认为过滤器调用存在问题。错误。您的问题来自前一行:Breakfast.foods.fetch();
。默认情况下,AJAX调用异步。有些人,当你致电filter
时,你的数据还没有从服务器回来。因此,0长度(集合本身具有0长度)。我邀请你看看that question我刚刚回答,看看这里有什么。
现在,关于collection: Breakfast.foods.filterByEveryday()
给你一个错误的原因。问题基本上不是来自Backbone。问题是你在你创建的对象中用它做了什么。 Breakfast.foods.filterByEveryday()
将返回数组,而不是集合。因此,当(我假设)之后您正在进行this.collection.bind(...)
时,您尝试将侦听器绑定到数组,而数组没有绑定方法。我会让你找到许多人的解决方案来听取子集合的事件。不过,我仍然坚持使用Events#listenTo方法(从Backbone 0.9开始),这可以(可以说,但从我的观点来看)更好地绑定侦听器(更容易删除它们并设置上下文) )。
最后,我会说过滤器对你使用它的方式没用。 Collection#where和Collection#findWhere是在这种情况下使用的方法。