1

如果我在我的集​​合中定义了一个过滤器,如下所示:

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().length 返回 0。即使我将测试更改为 true。我想我用错了吗?2. 路由中好像有很多逻辑,这对主干来说正常吗?似乎它应该在视图中,但我不确定如何重构它并拥有每个路由过滤器。
3.尝试将过滤后的集合传递给视图,如下所示:

collection: Breakfast.foods.filterByEveryday()

给我

TypeError: Object [object Array] has no method 'bind' 

所以我想那也是错误的。

4

1 回答 1

3

我会回答你的第一个和第三个问题。关于逻辑,我会说做你想做的事;)请记住,尽管您这样做的方式是,如果有人两次导航到同一条路线,您将两次获取您的收藏,依此类推...

所以让我们开始吧。您可能认为您的过滤器调用有问题。错误的。您的问题来自之前的一行:Breakfast.foods.fetch();. AJAX 调用默认是异步的。有些,当您调用时filter,您的数据还没有从服务器返回。因此,长度为 0(集合本身的长度为 0)。我邀请你看看我刚刚回答的那个问题,看看在这里做什么。

现在,关于原因collection: Breakfast.foods.filterByEveryday()给你一个错误。问题本质上并不来自 Backbone。问题是你在你创建的对象中做了什么。Breakfast.foods.filterByEveryday()将返回一个数组,而不是一个集合。因此,当(我假设)你在this.collection.bind(...)之后做一个时,你试图将一个监听器绑定到一个没有 bind 方法的数组。我会让你在众多监听子集合的事件中找到一个解决方案。尽管如此,我还是想坚持使用Events#listenTo方法(从 Backbone 0.9 开始),它(可以说,但从我的角度来看)更好地绑定侦听器(删除它们并设置上下文更容易)。

最后,我想说过滤器在你使用它的方式上没有用。Collection#whereCollection#findWhere是在这种情况下使用的方法。

于 2013-04-17T12:12:20.123 回答