2013-06-05 65 views
0

我试图按相关内容筛选某些内容。我遇到的麻烦是,当我尝试过滤时,相关内容未必会被加载。我试过使用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()失败的第一次,但之后它屡试不爽,因为数据是那么已经加载。

什么是筛选列表的最佳方式?

+0

很明显..这个答案不适合你吗? – ianpetzer

+0

问题更多的是关于如何在承诺中过滤,而不是实际的过滤本身。我看了一下这个ember-data代码,然后我意识到我可以在promise语境中调用一个控制器函数。 – Gevious

回答

1

您可以使用filterProperty功能筛选RecordArray:http://emberjs.com/api/classes/Ember.Enumerable.html#method_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('[email protected]') 
}); 

然后在你的模板,你可以使用:

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

编辑2013年6月6日...注意filterProperty现在被称为上App.Category.find()

+0

我不确定你有DS.Model上的filterProperty类的方法,但是你有DS.Model.filter(),它可以做同样的事情,并返回一个实时数组。我认为这可能是这个问题的解决方案(以及http://stackoverflow.com/questions/16936956/set-controllers-content-without-model-hook)cc/@Gevious –

+0

你是对的。 filterProperty是Enumerable mixin上的一个方法,所以需要在App.Category.find()上调用它。我已经更新了我的答案以显示此内容..... http://emberjs.com/api/classes/Ember.Enumerable.html#method_filterProperty – ianpetzer

+0

filterProperty已弃用支持filterBy https://github.com/emberjs /网站/拉/ 882 – Micah