Ember.JS数据模型:过滤计算属性

时间:2018-05-21 19:56:28

标签: ember.js

我的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始终为false。如果我添加以下内容,则在同一模板中:

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

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

2 个答案:

答案 0 :(得分:0)

好的,我想通了。结果模型返回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/

答案 1 :(得分:0)

我并不完全明白你想要实现的目标,但我会

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

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