我的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}}
我可以看到所有被枚举的值。不确定我错过了什么?非常感谢任何帮助。
答案 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)
我并不完全明白你想要实现的目标,但我会
加载DS.hasMany('thing', {async: false})
并确保它们包含在商店中。 (见https://embermap.github.io/ember-data-storefront/latest/)。如果在访问时将关系设置为async: false
,则会同步访问该关系,因此promises不会出现问题。
使用ember-concurrency可以帮助管理记录的加载并在页面上显示它们。