EmberJS中find()和filter(function(){return true;})之间的区别

时间:2013-12-05 13:20:59

标签: javascript ember.js

我正在做一个简单的餐厅菜单。我需要根据我们现在所处的类别过滤菜单列表。问题在于this.store.filter(...)方法的奇怪行为。它没有返回任何东西......

我想这样用:

App.DishRoute = Ember.Route.extend({
  model: function (param) {
    return this.store.filter('dish', function(dish) {
      return dish.get('category_id') == param.category_id;
    });
  }
});

但是出于测试目的,我在我的示例http://jsbin.com/AcoHeNA/43/中使用了this.store.filter('dish', function() {return true;});

请查看代码并告诉我我做错了什么或告诉我应该过滤数据的方式。

1 个答案:

答案 0 :(得分:3)

store.filter不查询服务器,只是过滤商店中已加载的数据。在您的情况下,因为您不在任何时刻加载数据,过滤器将返回空结果。您可以修改它,调用this.store.find('dish');从服务器加载数据,以便更新任何filter('dish', ...)

App.DishRoute = Ember.Route.extend({
  model: function (param) {
    console.log(param.dish_id);

    // pre load the data
    this.store.find('dish');
    // filter the prefetch data, when update the filter when new data are loaded
    return this.store.filter('dish', function(){return true;});    
  }
});

这是更新的jsbin http://jsbin.com/akeJOTah/1/edit

这是最常用的商店方法的概述:

  1. store.find('dish')=>用/ dishes发送请求
  2. store.find('dish',1)=>发送请求/ dishes / 1
  3. store.find('dish',{name:'some'})=>用/ dishes发送请求?name = some
  4. store.filter('dish',function(){...})=>客户端过滤,不发送请求,只过滤商店中存在的数据
  5. store.filter('dish',function(){...},{foo:'bar'})=>运行find with query(第3项)并执行客户端过滤
  6. store.all('dish')=>不要发送请求,只需获取商店中加载的所有数据