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}),
});
在我看来像是一个错误。
延迟加载的问题 ember 有很多关系现在让我发疯。
我的 Ember 模型与其他实例有关系:
app/models/apps/app.js 从 'ember-data';
导入 DSexport 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}),
});
在我看来像是一个错误。