强制compute.filter()更新?

时间:2017-11-24 20:57:56

标签: ember.js ember-data

我有一个一次的过滤器,其中包含预先初始化的任何值,只是在初始初始化时,但从不更新。 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方式来实现我的目标:在我的服务中,我创建但不保存记录在我正在过滤的模型中,只是为了强制更新。每当过滤器参数改变时,我用当前时间(毫秒)更新该记录。当然,它总是被过滤器过滤掉。

这很难看,它可能是邪恶的...有更好的方法吗?

1 个答案:

答案 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);
  }),
  ...