如何在我的路线中使用模型中的过滤器

时间:2013-04-17 08:40:51

标签: backbone.js

如果我在我的收藏中定义了一个过滤器,如下所示:

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' 

我想这也错了。

1 个答案:

答案 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#whereCollection#findWhere是在这种情况下使用的方法。