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上下文中调用控制器函数。