这是我的路线模型:
// routes/filter-categories.js
import Ember from 'ember';
export default Ember.Route.extend({
model() {
this.store.findAll('product');
var products = this.store.filter('products', function (product) {
console.log('filtering product %o', product.get('id'));
...
});
return products;
},
});
基本上,当我进入filter-categories
路由时,我需要al产品,然后我需要对这些产品执行一些客户端过滤。
看一下控制台日志,我第一次访问filter-categories
路线时,看到以下内容:
filtering product "101"
filtering product "102"
filtering product "103"
...
filtering product "101"
...
filtering product "101"
...
filtering product "101"
...
首次进入时,每种产品最多可过滤4次(处理产品的顺序实际上不具有确定性)。我期待每个产品只被过滤一次!
从现在开始,事情变得更糟:每次进入filter-categories
路线时,每个产品都会再次执行过滤。所以在某些时候我有:
filtering product "101"
filtering product "102"
filtering product "103"
...
filtering product "101"
filtering product "101"
filtering product "101"
filtering product "101"
filtering product "101"
filtering product "101"
...
filtering product "102"
filtering product "102"
filtering product "102"
filtering product "102"
filtering product "102"
filtering product "102"
...
(现在它看起来很确定)
如果我在申请路线中请求产品:
// routes/application.js
import Ember from 'ember';
export default Ember.Route.extend({
init() {
this._super(...arguments);
this.store.findAll('product');
},
...
});
然后我在顶部网址上启动应用程序,然后转换到我的filter-categories
路由(不再有this.store.findAll('product');
),我得到以下日志:
filtering product "101"
filtering product "102"
filtering product "103"
...
这是我所期待的。但这有一个问题,即我在应用程序路径中请求products
,我实际上并不需要它们,只是为了解决一些Ember奇怪的行为。
我想了解这里发生了什么,以便正确实施。
我认为这必须with the fact that:
如果任何记录的属性发生了变化,或者它的状态发生了变化,那么 将再次调用filter函数以确定是否应该 仍然在阵列中。
但我仍然无法完全了解正在发生的事情。为什么过滤轮数增加?
答案 0 :(得分:0)
我认为你的代码顺序是错误的findAll是一个异步调用你调用它后没有完成,有几个选项来处理这个
1. I wouldn´t do it
this.store.findAll('product').then(function(results) {
var filtedResults = results.filter(function(product) {
if (condition) {
return true; //added to array
} else {
return false;
}
});
return filteredResults;
});
2. route
model() {
return this.store.findAll('product');
}
// in controller *value=value to observe for changes to determine if the model should be contained in products array
filteredProducts: Ember.computed('model.[]', 'model.@each.value', function() {
var filtedResults = this.get('model').filter(function(product) {
if (condition) {
return true; //added to array
} else {
return false;
}
});
return filtedResults;
}),
//template
{{#each filteredProducts as |product|}}
{{product}}
{{/each}}