【问题标题】:Ember errors "Uncaught TypeError: Cannot read property 'typeKey' of undefined " on model save模型保存时的 Ember 错误“未捕获的 TypeError:无法读取未定义的属性 'typeKey'”
【发布时间】:2026-02-06 02:45:01
【问题描述】:

我的 RESTAdapter 配置:

App.ApplicationAdapter = DS.RESTAdapter.extend
  namespace: '/api'

我的模特:

module.exports = App.Cat = DS.Model.extend
  name: DS.attr 'string'
  description: DS.attr 'string'
  picture: DS.attr 'string'
  location: DS.attr 'string'
  profileStyle: DS.attr 'string'
  created: DS.attr 'date'

我的路线:

Cat = require '../../models/cat'

App.CatNewRoute = Em.Route.extend
  model: ->
    @store.createRecord(Cat, {
      created: new Date()
    })

我的控制器:

App.CatNewController = Em.ObjectController.extend
  actions:
    addCat: ->
      console.log 'saving...'
      @get('model').save().then ->
        console.log 'all done'

我已经通过 Ember 检查器验证了我的模型具有在保存时通过模板上的表单分配的所有属性(除了为 null 的 id - 我认为这是正常的,默认情况下是 Ember使用服务器分配给模型的 ID)。每当我保存模型时,我都会收到错误:

Uncaught TypeError: Cannot read property 'typeKey' of undefined 

在ember数据源代码这里出现这个错误:

if (container) {
  adapter = container.lookup('adapter:' + type.typeKey) || container.lookup('adapter:application');
} 

我正在使用 Ember-data 1.0.0 beta 3-2 和 Ember 1.0.0-4。我已经尝试了几个不同版本的 Ember 数据以达到相同的效果。

jsBin 中的近似:http://jsbin.com/ixIqIjI/6/edit?html,js,console,output

这个 jsBin 也出现 typeKey 错误。

【问题讨论】:

  • 你有没有想过这个问题?

标签: ember.js


【解决方案1】:

我找到了解决方案。 createRecord 接受 typerecord 参数,但 type 不能是像 App.Cat 这样的显式模型名称,它必须是一个字符串,Ember 然后根据名称附加到正确的模型。在这种情况下,创建记录的正确方法是this.store.createRecord('cat', {...} )

【讨论】:

    【解决方案2】:

    我认为您的要求返回未定义。

    Cat = require '../../models/cat'
    Cat // the variable Cat is undefined
    

    所以,这段代码会失败

    @store.createRecord(Cat /* Cat is undefined*/, {
      created: new Date()
    })
    

    您确定猫模型在路径../../models/cat 中吗?

    ember-tools这样的一些构建工具,需要你使用module.exports暴露类,如果你正在使用它,你需要使用:

    module.exports = Cat; 
    

    在你的 cat.js 文件中。

    希望对你有帮助

    【讨论】:

    • 感谢您的建议,马西奥!我对 Cat 的要求确实是返回模型。我的实际文件中有module.exports = App.Cat = DS.Model.extend,为了便于阅读 *,我将其关闭。我通过在路由中放置一个调试器并在需要它后检查 Cat 的值来确保它指向App.Cat。我已经编辑了我原来的问题,以防其他人和你有同样的想法。
    • 不客气。这很奇怪,因为接收此错误的唯一方法是 Cat 未定义。在运行时type.typeKey 将变为Cat.typeKey 并且typeKey 的值为“cat”。我试图模拟这个问题但没有成功。你能用小提琴模拟这个吗?
    • 这是以不同方式出错的近似值(无法保存 null):jsbin.com/ixIqIjI/1/edit
    • 我更新为使用 FixtureAdapter,但在我的情况下有效。控制台打印all done,请看jsbin.com/ixIqIjI/2/edit。我仍然认为您收到此错误是因为您的构建工具。这是一个 jsbin,我在其中强制执行您当前的错误 jsbin.com/ixIqIjI/5/edit
    • 您能发布一个使用 RESTAdapter 的示例吗?我也可以让它与 Fixtures 一起使用,但我希望它与服务器连接,而不仅仅是使用静态数据。谢谢!显然它仍然会出错,因为不会有带有 Fiddle 的服务器,但它仍然应该超过当前的位置,对吗?另外,以您“强制”错误的示例为例,它实际上在我的示例之前就出错了。在您的中,它看到该路线正在创建不良记录,甚至不会继续渲染 cat.new 模板,而我的则走得那么远,并且在执行 addCat 时根本失败
    【解决方案3】:

    我更新了您的 JSBin 以正常工作。 您必须传递模型的字符串版本,因此对于 App.Cat,您将传递“cat”以获取 App.BigPost 之类的内容,您将传递“bigPost”字符串将被解析为模型,然后 ember-data 适配器将知道该怎么做。

    工作版 - http://jsbin.com/ixIqIjI/10/edit

    【讨论】:

      最近更新 更多