find()和getById()之间的Ember数据差异

时间:2013-11-20 15:48:16

标签: javascript ember.js ember-data

我知道有一个名为Ember data: what is difference between find and findById?的问题。但是,如果我错了,请更正,但我认为它与旧版本的Ember数据有关,因为我在embet-data doc中找不到此方法。

我试图在我的目录中插入一个新类别。这不起作用:

newRecord: function() {
    catalog = this.store.find('catalog', 1);
    record = this.store.createRecord( 'category', {category_name_fr_sh: 'Nouvelle categorie'});
    catalog.get('catalog_categories_ids').pushObject(record);
    this.set('content', record);
},

但是这项工作:

newRecord: function() {
    catalog = this.store.getById('catalog', 1);
    record = this.store.createRecord( 'category', {category_name_fr_sh: 'Nouvelle categorie'});
    catalog.get('catalog_categories_ids').pushObject(record);
    this.set('content', record);
},

医生说

  

按指定类型和ID获取记录,而不触发提取。   如果记录可用,此方法将同步返回记录。否则,它将返回null。

我真的不明白为什么“劫持获取”不起作用。我认为find()首先看它是否在商店缓存中,只有在找不到时才获取。有人可以开导我吗?

1 个答案:

答案 0 :(得分:6)

this.store.find('catalog', 1);不会返回记录,而是返回DS.PromiseObject。因为,如果您的记录不在记录缓存中,则需要向服务器发出请求。如果已经加载了记录,则仍然具有promise对象,以保持相同的方法行为,但不会向服务器发送请求。

this.store.getById('catalog', 1);从记录缓存中返回对象(如果存在)。可能这项工作是因为您已使用this.store.find('catalog');this.store.find('catalog', 1);

加载了目录

您可以使用DS.PromiseObject方法从then获取目录记录:

newRecord: function() {
    var self = this;
    var catalogPromise = this.store.find('catalog', 1);
    catalogPromise.then(function(catalog) {
        var record = this.store.createRecord( 'category', {category_name_fr_sh: 'Nouvelle categorie'});
        catalog.get('catalog_categories_ids').pushObject(record);
        self.set('content', record);
    })
},