检查Ember Data中的belongsTo()关系是否存在

3

我有一个叫做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' }) 
});

我通过查找没有父级的列表来确定路由文件中的“根”级别列表。

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')) 完全不是检查父级关系存在的正确方法。
  • 我觉得我可能没有正确地过滤整个列表集合。 我故意调用索引API请求以便加载所有列表,但当我导航到子列表并单击后退按钮时,XHR请求会第二次发出!
  • 在此基础上衍生出的问题是,过滤仅限于初始页面加载。如果我进入列表然后点击后退按钮,则子列表将保留在页面上(没有任何错误!)。

检查父级关系存在的正确方法是什么?

此外,找到一条记录的正确过滤整个列表的方法是什么?

是我的无知导致了后退按钮的问题吗?


1
Ember.isEmpty(list.get('parent').get('content')) 可以变成 ParentExists: Ember.computed.notEmpty(xx) - kristjan reinhold
2个回答

4
自从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');
    }); 
  }
});

还可以检查关系是否已经被加载,手动加载它,重新加载它以及其他一些很酷的事情。
更多详细信息请查看发布说明


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

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接