检查ember数据

时间:2015-09-21 03:41:43

标签: ember.js ember-data

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

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

此外,使用正确方式过滤整个列表以找到一条记录?

我的无知是什么造成了后退按钮的问题?

2 个答案:

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

});