有人可以解释异步如何与belongsTo / hasMany关系一起使用?

时间:2016-01-08 22:17:50

标签: ember.js ember-data

我的ember应用程序中有这个代码:

var FooModel = DS.Model.extend({
    bars: DS.hasMany( 'bar', { async: true, inverse: 'foo'} )
});

var BarModel = DS.Model.extend({
    foo: DS.belongsTo( 'foo', { async: true, inverse: 'bars'} )
});

修改:使用

Ember      : 1.13.7
Ember Data : 1.13.8

但是当我去渲染foo.bars时,除非我使用浏览器后退和前进按钮,否则它们不会被加载。重新加载页面会导致foo.bars再次消失。

当我将代码更改为:

var FooModel = DS.Model.extend({
    bars: DS.hasMany( 'bar', { async: true } )
});

var BarModel = DS.Model.extend({
});

一切都按原样运作,我真的很困惑为什么。特别是因为我从另一个ember应用程序中获取了原始代码,它工作正常(尽管可能有一些我不知道的适配器/序列化器魔术)。 修改:正在使用的应用

Ember      : 1.4.0
Ember Data : 1.0.0-beta.7+canary.b45e23ba
Handlebars : 1.3.0

编辑:为两者使用REST适配器

2 个答案:

答案 0 :(得分:0)

关系中的异步

{ async: true}是自1.13以来Ember关系的默认值,这意味着在大多数情况下,您可以定义关系而不指定异步值。这意味着在需要之前,相关记录不会加载到商店中。这几乎总是理想的方式,因为它通过返回一个promise来阻止阻塞。请记住,promises需要一种不同的编程方式,因为该过程不再是逐步完成代码的过程。您通过链接.then(function(param){// handle fulfilled promise here});来管理承诺。

有些情况{ async: false}可能是有益的。例如,在一对一的关系中,您希望立即加载关系的两面。

为什么您的代码不起作用

我不确定,但似乎代码已经写好了,而且可能是代码中的错误。与上面的异步相同,您也不需要在此处指定反向值。根据Ember文件:

  

Ember Data将尽力发现哪些关系相互映射。 Explicit Inverses

您的应用程序作为简单的一对多关系应该可以正常使用:

var FooModel = DS.Model.extend({
    bars: DS.hasMany( 'bar' )
});

var BarModel = DS.Model.extend({
    foo: DS.belongsTo( 'foo' )
});

答案 1 :(得分:0)

我回答了类似的问题What is an “async relationship”? / {async: true} vs. {async: false}

异步关系(默认)

访问该关系将返回一个承诺。

post.get('comments').then((comments) => {
  // now we can work with the comments
});

如果数据不可用并且可以访问该关系(例如,从模板或“已消耗”的计算属性),则Ember Data将自动获取资源。

详细了解Relationships as Promises

同步关系(来自文档)

Ember Data解决与相关资源的同步关系   可在其本地商店中购买,因此预计这些资源   可以在主要资源之前或旁边加载。

属于...

  export default DS.Model.extend({
    post: DS.belongsTo('post', {
      async: false
    })
  });

与异步关系相反,访问同步关系   将始终返回现有记录的记录(模型实例)   本地资源,或者为null。但是当访问时会出错   已知相关资源存在并且尚未加载。

  let post = comment.get('post');

有很多

  export default DS.Model.extend({
    comments: DS.hasMany('comment', {
      async: false
    })
  });

与异步关系相反,访问同步关系   将始终返回一个DS.ManyArray实例   包含现有的本地资源。但是访问会出错   当尚未加载任何已知的相关资源时。

  post.get('comments').forEach((comment) => {
  });

如果您将links用于同步关系,则必须使用   ref.reload来获取资源。