【问题标题】:Ember.JS data model: Filtering a computed propertyEmber.JS 数据模型:过滤计算属性
【发布时间】:2018-05-21 19:56:28
【问题描述】:

我有一个 Ember 数据模型 logger,定义如下:

import DS from 'ember-data';
import EmberObject, { computed } from '@ember/object';
export default DS.Model.extend({

    someAttribute: DS.hasMany('attr'),
    test: computed('someAttribute.[]', function(){
        return this.get('someAttribute').filterBy('description', 'some value');        
    })
});

上述模型作为logger 变量从控制器传递到我的组件模板中。在我的模板中:

{{#if logger.test}}    
    <h1> Testing </h1>
    {{log logger.test.description }}
{{/if}}

模板中的logger.test 似乎总是错误的。如果我在同一个模板中添加以下内容:

{{#each logger.someAttribute as |t|}}
    {{t.description}}
{{/each}}

我可以看到所有被枚举的值。不确定我错过了什么?任何帮助将不胜感激。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    好的,我想通了。结果模型返回了 Promise,而 if 语句不能很好地处理 Promise。正确的做法是从计算的属性中返回一个DS.promiseArray,然后一切都像魅力一样工作:

    return DS.PromiseArray.create({
                promise: this.get('someAttribute').then(logs => {return logs.filterBy('description')})
            });
    

    致谢:https://emberigniter.com/guide-promises-computed-properties/

    【解决方案2】:

    我不完全了解您要达到的目标,但我要么

    1. 加载DS.hasMany('thing', {async: false}) 并确保它们包含在商店中。 (见https://embermap.github.io/ember-data-storefront/latest/)。如果在访问时将关系设置为async: false,则同步访问,因此promise没有问题。

    2. 使用 ember-concurrency 可以帮助管理记录的加载并在页面上显示它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多