【问题标题】:Check existence of belongsTo() relation in ember data检查ember数据中是否存在belongsTo()关系
【发布时间】:2015-09-21 03:41:42
【问题描述】:

我有一个名为 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 请求再次发出!
  • 在此基础上,过滤适用于初始页面加载。如果我进入一个列表然后点击后退按钮,子列表会保留在页面上(没有错误或任何东西!)。

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

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

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

【问题讨论】:

  • Ember.isEmpty(list.get('parent').get('content')) 你可以去 ParentExists: Ember.computed.notEmpty(xx)

标签: ember.js ember-data


【解决方案1】:

从 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了解更多详情。

【讨论】:

    【解决方案2】:

    如果没有相关记录,那么对应的属性应该是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;
        }); 
      }
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2020-06-21
      • 2021-02-18
      • 2014-11-14
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多