我正在准备一个简单的餐厅菜单。我需要根据当前当前类别来过滤菜肴清单。问题出在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;
    });
  }
});


但出于测试目的,我在示例中使用this.store.filter('dish', function() {return true;});

请查看代码,并告诉我我在做什么错,或者告诉我应该如何过滤数据。

最佳答案

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

这是最常用的存储方法的概述:


store.find('dish')=>使用/ dishes发送请求
store.find('dish',1)=>使用/ dishes / 1发送请求
store.find('dish',{name:'some'})=>使用/ dishes发送请求?name = some
store.filter('dish',function(){...})=>客户端过滤,不发送请求,仅过滤存储中存在的数据
store.filter('dish',function(){...},{foo:'bar'})=>使用查询运行查找(项目3)并执行客户端过滤
store.all('dish')=>不发送请求,仅获取存储在商店中的所有数据

关于javascript - EmberJS中的find()和filter(function(){return true;})之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20401127/

10-09 20:26