我有一个名为List的模型,它代表一个导航树。我应该可以导航到子列表,然后点击后退按钮返回到父列表。
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
children: DS.hasMany('list', { inverse: 'parent' }),
parent: DS.belongsTo('list', { inverse: 'children' })
});
我确定" root"通过查找没有父项的列表,在我的路由文件中找到级别列表。
import Ember from 'ember';
export default Ember.Route.extend({
model(){
return this.store.findAll('list').then(function(lists){
return lists.filter(function(list){
if(Ember.isEmpty(list.get('parent').get('content'))) {
return true;
}
else {
return false;
}
}).get('firstObject');
});
}
});
我觉得我的实现有很多错误,即使它适用于初始页面加载。
Ember.isEmpty(list.get('parent').get('content'))
完全似乎是检查父关系是否存在的错误方法。检查父关系是否存在的正确方法是什么?
此外,使用正确方式过滤整个列表以找到一条记录?
我的无知是什么造成了后退按钮的问题?
答案 0 :(得分:2)
从Ember Data 2.5开始,可以使用新的References API来检查belongsTo关系是否存在。
你只需要检查obj.belongsTo('relation')。id()是否为空。
在OP的例子中,它将成为:
import Ember from 'ember';
export default Ember.Route.extend({
model(){
return this.store.findAll('list').then(function(lists){
return lists.filter(function(list){
if(list.belongsTo('parent').id() === null) {
return true;
}
else {
return false;
}
}).get('firstObject');
});
}
});
还可以检查关系是否已经加载,手动加载,重新加载以及其他一些很酷的东西。
查看release notes了解详情。
答案 1 :(得分:0)
如果没有相关记录,则相应的属性应为null
。因此,您可以像这样简化代码:
import Ember from 'ember';
export default Ember.Route.extend({
model(){
return this.store.findAll('list').then(function(lists){
return lists.findBy('parent', null);
});
}
});
如果您需要缓存模型数据以避免命中服务器,您还可以添加:
import Ember from 'ember';
export default Ember.Route.extend({
parentModel: null,
model(){
var _this = this;
return this.parentModel || this.store.findAll('list').then(function(lists){
_this.parentModel = lists.findBy('parent', null);
return _this.parentModel;
});
}
});