【问题标题】:Force computed.filter() to update?强制computed.filter() 更新?
【发布时间】:2018-05-08 20:40:15
【问题描述】:

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

它很丑,它可能是邪恶的......有没有更好的方法?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    在计算定义中定义每个变量(在计算函数中使用):

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

    【讨论】:

    • 我知道“回调调用不是函数”;从Ember source for filter 看,过滤器只接受一个键(array_macro),它只处理one dependentKey value。我应该使用不同的功能吗?添加这些变量的其他方式?
    • 另外,要处理model 的更新,请考虑在计算定义中使用model.[] 而不是model。见computed-properties-and-aggregate-data
    • 最里面的函数(过滤器)似乎无法访问“this”或其他任何本地内容。任何 Ember.get(this, ...) 和任何 this.get(...) 都会失败,因为 this 显然是未定义的。它是在第一级(计算(args,函数(){...})级别定义的,而不是在计算(args,函数(){filter(函数(){-here-...}) ...})) 级别。
    猜你喜欢
    • 2019-10-26
    • 2018-12-26
    • 2019-02-09
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多