Ember.js 关联模型过滤模型

Ember.js 关联模型过滤模型,ember.js,ember-data,Ember.js,Ember Data,我正试图通过相关内容过滤一些内容。我遇到的问题是,当我尝试筛选时,相关内容不一定已加载。我尝试使用then()函数,但无法访问范围外的变量。这是我试过的 var filter = this.get('categoryFilter').toLowerCase(); App.Category.find().then(function() { content = this.get('content').filter(function(item) { return item.get('categ

我正试图通过相关内容过滤一些内容。我遇到的问题是,当我尝试筛选时,相关内容不一定已加载。我尝试使用
then()
函数,但无法访问范围外的变量。这是我试过的

var filter = this.get('categoryFilter').toLowerCase();
App.Category.find().then(function() {
 content = this.get('content').filter(function(item) {
   return item.get('category.name').toLowerCase() === filter;
   // ERROR! filter variable doesn't exist here
  }, this);
});
没有
then()
的过滤第一次失败,但每次失败后它都会工作,因为数据已经加载


过滤列表的最佳方法是什么?

您可以使用filterProperty函数过滤记录数组:

尝试以下方法:

var filteredCategories = App.Category.find().filterProperty('nameLowerCase', filter);
在您的类别中,您需要一个属性来运行筛选器

App.Category = Ember.Object.extend({

  name: '',

  nameLowerCase: function() {
    return this.get('name').toLowerCase();
  }.property('name')

});
假设您有一个CategoriesRoute,它将Categories控制器的模型设置为App.Category.find(),那么您可以使用以下代码从模板访问筛选列表:

App.CategoriesController = Ember.Array.extend({

  filtered: function() {
    var filter = 'String value to compare lower case name to';
    return this.get('model').filterProperty('nameLowerCase', filter);

  }.property('model.@each.nameLowerCase')
});
然后,您可以在模板中使用:

{{#each filtered}}
  //Your code here
{{/each}}

2013年6月6日编辑。。。请注意,filterProperty现在在App.Category.find()上被调用。

我不确定您在DS.Model上是否有filterProperty类方法,但您有DS.Model.filter(),它也有同样的功能,并返回一个活动数组。我认为这可能是这个问题的一个解决方案(以及)cc/@GeviousYou是对的。filterProperty是可枚举mixin上的一个方法,因此需要在App.Category.find()上调用它。我已经更新了我的答案以显示这一点。。。。。filterProperty被弃用,取而代之的是filterBy Gevious。。这个答案对你不适用吗?问题更多的是关于如何在承诺内过滤,而不是实际的过滤本身。我看了一下ember数据代码,意识到我可以在promise上下文中调用控制器函数。