【发布时间】:2015-06-18 08:24:36
【问题描述】:
我正在使用 ember 1.13、ember-cli 和 ember data 1.19.1,我遇到了一个由于不具体而难以追踪的错误。当我执行以下操作时会发生错误:
this.get('model').forEach(function(mymodel) {
applications.push(elavonApplication.serialize({includeId: true}));
});
其中“elavonApplication”是名为“elavon-application”的 DS.Model 的一个实例,错误本身的 sn-p 是:
Uncaught TypeError: Cannot read property 'modelFor' of undefined
ember$data$lib$system$model$$default.reopenClass.typeForRelationship @
ext.js:171ember$data$lib$system$model$$default.reopenClass._findInverseFor @
ext.js:214ember$data$lib$system$model$$default.reopenClass.inverseFor @
ext.js:205Ember.Mixin.create.removeEmbeddedForeignKey @ embedded-records-mixin.js:317
Ember.Mixin.create.serializeBelongsTo @ embedded-records-mixin.js:199
elavon-application 继承自名为 iso-application 的父 DS.Model。型号如下:
// models/iso_application.js
import DS from 'ember-data';
export default DS.Model.extend({
status: DS.belongsTo('iso-application-status'),
statusId: DS.attr('number'),
quickQuote: DS.belongsTo('quick-quote'),
quickQuoteId: DS.attr('number'),
acquirer: DS.belongsTo('acquirer'),
acquirerId: DS.attr('number'),
cardPresentStatus: DS.belongsTo('iso-application-status'),
cardPresentStatusId: DS.attr('number'),
ecommStatus: DS.belongsTo('iso-application-status'),
ecommStatusId: DS.attr('number'),
});
// models/elavon-application.js
import DS from 'ember-data';
import IsoApplication from 'paya-operations/models/iso-application';
export default IsoApplication.extend({
principal: DS.belongsTo('iso-elavon-principal'),
businessInfo: DS.belongsTo('iso-elavon-business-info'),
});
iso-application 模型有几种关系,包括一种称为“status”的关系,它链接到下面的“iso-application-status”DS.Model:
// models/iso-application-status.js
import DS from 'ember-data';
export default DS.Model.extend({
isoApplications: DS.hasMany('iso-application', {inverse: 'status'}),
description: DS.attr('string'),
colour: DS.attr('string')
});
该错误仅在存在关系时发生。在插入断点并在代码运行时单步执行代码后,我发现在 ext.js 的“typeForRelationship”函数中,Ember 抛出错误时,“store”参数为空。当我逐步完成时,它为我在模型中拥有的每个关系提供了它,然后当它达到“状态”关系时,它就变为空了。我不知道这是为什么,但这与提供给模型的数据无关,因为所有状态 ID 都存在于数据库中。
我使用 ActiveModelSerializer 和 EmbeddedRecordsMixin 来访问我的服务器后端。我没有 iso-application-status 模型或 iso-application 模型的序列化程序。 iso-application 的所有属性都由 elavon-application 模型继承,所以我有一个序列化程序来代替:
// serializers/elavon-application.js
import DS from "ember-data";
export default DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
status: {embedded: 'always'},
quickQuote: {embedded: 'always'},
acquirer: {embedded: 'always'},
principal: {embedded: 'always'},
businessInfo: {embedded: 'always'},
}
});
请问有谁知道我做错了什么?
谢谢。
【问题讨论】:
-
服务器提供什么响应?
-
您说所有状态 ID 都存在。您已将状态指定为嵌入记录 - 这意味着数据应该期待完整的对象,而不仅仅是引用该对象的 ID。没有看到我的第一个猜测是来自服务器的数据
-
感谢您的回复。我不是很清楚,但从服务器返回的状态记录的 json 确实包含这种形式的对象 {id:“6”,描述:“入职”,颜色:“黄色”}。事实上,在 Ember Inspector 中,我可以看到模型,因此它们已被正确拉入。
-
错误发生在我上面提到的行 (applications.push(mymodel.serialize({includeId: true}));) 在 forEach 中,它正在序列化要添加到大批。它出现在集合中的第一个模型上,从我提供的堆栈跟踪中可以看出,它是正在序列化的 belongsTo 的一部分 (Ember.Mixin.create.serializeBelongsTo)。这有帮助吗?
-
从 iso-application-status 序列化器中删除
attrs开始 - 这不是你指定 async:true 的地方 - 你在模型中指定它.. 你给了 my-model 模型.. iso-application-status 模式是什么样的?另外,尝试添加:status: DS.belongsTo('iso-application-status', { inverse: null })
标签: ember.js ember-data ember-cli