Ember 数据:第一次访问延迟加载的 hasMany 关系将它们从模型中删除

Ember Data: first access to lazy loaded hasMany relationships removes them from model

延迟加载的问题 ember 有很多关系现在让我发疯。

我的 Ember 模型与其他实例有关系:

app/models/apps/app.js 从 'ember-data';

导入 DS
export default DS.Model.extend({
    title: DS.attr("string"),
    childApps: DS.hasMany('apps/app', {inverse: 'parentApp', async:true}),
    parentApp: DS.belongsTo('apps/app', {inverse: 'childApps', async:true}),
});

当路由加载模型时,使用 findRecord(),第一次 Rest API returns 类似于:

{
  "title":"some title",
  "childApps":[40,36,38,44,54,55,39,51,53],
  "dateCreated":"2015-10-01T03:34:16Z"
  "id":35,
  "version":0,
  "parentApp":null
}

第一次访问关系(例如在模板中){{model.childApps.length}} 浏览器开始延迟加载所有相关数据。 从网络日志和 ember 检查员数据视图中可以看出,所有内容都可以成功检索。他们都装到了商店。

但是,在当前视图中,加载记录后 childApps 为空。 {{model.childApps}} {{model.childApps.length}} 呈现 <DS.PromiseManyArray:ember1459> 0

在调查我发现的错误时,一旦一条记录从后端成功解析,它就会从 {{model.childApps}} 数组中删除,并逐步缩小到 0 的长度。

因此我在组件中添加了一个计算 属性,我可以在其中设置断点并观察行为

childApps: Ember.computed('appData.childApps.[]', function(){
    return this.get("appData.childApps");
}),

我还发现,如果记录已经加载到商店中,例如。如果我第二次导航到同一条路线,一切正常。


我终于找到了一个解决方案,如何在第一次加载时通过向路由添加以下内容来正确初始化记录

setupController: function(controller, model) {
    model.get("childApps").then(function(data){
        model.reload();
    });
    controller.set('model', model);
}

但我不认为这是应该的,对吧?我对此不是很满意。

我想它也可以在第一次访问时工作,而无需在 setupController 方法中重新加载模型。

有人知道我做错了什么吗?


我正在使用 ember-cli 1.13.8、ember 2.0.1 和 ember-data: 2.0.0

我终于找到了导致这种行为的原因。 逆向设置:

export default DS.Model.extend({
    title: DS.attr("string"),
    childApps: DS.hasMany('apps/app', {inverse: 'parentApp', async:true}),
    parentApp: DS.belongsTo('apps/app', {inverse: 'childApps', async:true}),
});

从 parentApp 中删除反向设置 属性 为我修复了它并且关系得到正确的延迟加载。

export default DS.Model.extend({
    title: DS.attr("string"),
    childApps: DS.hasMany('apps/app', {inverse: 'parentApp', async:true}),
    parentApp: DS.belongsTo('apps/app', {async:true}),
});

在我看来像是一个错误。