有人能解释一下async是如何处理belongsTo/hasMany关系的吗



我的会员应用程序中有以下代码:

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适配器

relatoships 中的异步

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

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

为什么你的代码不工作

我不确定,但似乎你写的代码可能是代码中的一个bug。与上面的async相同,您实际上也不需要在这里指定反值。根据Ember文件:

Ember Data将尽最大努力发现哪些关系相互映射。显式逆

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

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

我回答了一个类似的问题什么是"异步关系"?/{async: true}{async: false}

异步关系(默认)

接触这种关系会得到承诺。

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

如果数据不可用,并且关系被访问(例如,从模板或"消耗"的计算属性),Ember data将自动获取资源。

阅读更多关于承诺关系

同步关系(来自文档)

Ember Data解决与相关资源的同步关系在其本地商店中可用,因此期望这些资源以便在主资源之前或沿着主资源加载。

归属

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

与异步关系相反,访问同步关系将始终返回现有本地资源或null。但当已知存在相关资源,但尚未加载该资源。

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

HasMany

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

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

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

如果使用具有同步关系的links,则必须使用CCD_ 9来获取资源。

最新更新