【问题标题】:Ember Data "modelFor" error when serializing models序列化模型时出现 Ember Data“modelFor”错误
【发布时间】: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


【解决方案1】:

我已经通过重新安装 ember-cli 和 ember-data 解决了这个问题。我认为最近在从 1.12.0 版本升级到 1.13.0 和 ember-data 1.0.0-beta.17.0 到 1.0.0-beta.19.1 的升级过程中出现了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多