我有一个一次的过滤器,其中包含预先初始化的任何值,只是在初始初始化时,但从不更新。 editstate是一项服务;在这种情况下,它只提供那些暴露的变量。因此,当更改editstate.filterValue和editstate.filterField时,过滤器应该更新。
但事实并非如此。
我已经尝试过将它们作为本地计算值,但没有骰子。到目前为止唯一有效的程序设计是使用把手{{#if toggle。
来取消并重新渲染整个组件。export default Ember.Component.extend({
store: Ember.inject.service(),
editstate: Ember.inject.service('edit-state'),
filteredList: Ember.computed.filter('model', function(current, index, all) {
return current.get(Ember.get(this.get('editstate'), 'filterField')) == Ember.get(this.get('editstate'), 'filterValue');
}),
我错过了什么?我没有看到任何用于强制过滤器重新计算的API,也没有更明确地告诉它来观察这些值。
更新:我找到了一个可怕的hacky方式来实现我的目标:在我的服务中,我创建但不保存记录在我正在过滤的模型中,只是为了强制更新。每当过滤器参数改变时,我用当前时间(毫秒)更新该记录。当然,它总是被过滤器过滤掉。
这很难看,它可能是邪恶的...有更好的方法吗?
答案 0 :(得分:0)
在计算定义中定义每个变量(在计算函数中使用):
export default Ember.Component.extend({
store: Ember.inject.service(),
editstate: Ember.inject.service('edit-state'),
filteredList: Ember.computed('model', 'editstate.filterField', 'editstate.filterValue', function() {
return this.get('model').filter((current) => {
return current.get(Ember.get(this.get('editstate'), 'filterField')) === Ember.get(this.get('editstate'), 'filterValue');
}
}),
...
甚至更具可读性:
export default Ember.Component.extend({
store: Ember.inject.service(),
editstate: Ember.inject.service('edit-state'),
filteredList: Ember.computed('model', 'editstate.filterField', 'editstate.filterValue', function() {
let filterField = Ember.get(this, 'editstate.filterField');
let filterValue = Ember.get(this, 'editstate.filterValue');
return this.get('model').filterBy(filterField, filterValue);
}),
...