【问题标题】:TypeError: Cannot read property 'forEach' of undefined Ember-DataTypeError:无法读取未定义的 Ember-Data 的属性“forEach”
【发布时间】:2014-05-27 02:50:43
【问题描述】:

当我点击我的应用程序的“/”时,我得到了下面的堆栈跟踪

Error while loading route: TypeError: Cannot read property 'forEach' of undefined
    at Function.Model.reopenClass.eachAttribute (http://localhost:3000/assets/ember-data.js?body=1:4870:32)
    at JSONSerializer.extend.normalizeAttributes (http://localhost:3000/assets/ember-data.js?body=1:2906:16)
    at JSONSerializer.extend.normalize (http://localhost:3000/assets/ember-data.js?body=1:2827:14)
    at superWrapper (http://localhost:3000/assets/ember.js?body=1:1293:16)
    at superFunction [as _super] (http://localhost:3000/assets/ember.js?body=1:7724:16)
    at RESTSerializer.extend.normalize (http://localhost:3000/assets/ember-data.js?body=1:378:21)
    at superWrapper [as normalize] (http://localhost:3000/assets/ember.js?body=1:1293:16)
    at null.<anonymous> (http://localhost:3000/assets/ember-data.js?body=1:3179:35)
    at Array.map (native)
    at JSONSerializer.extend.extractArray (http://localhost:3000/assets/ember-data.js?body=1:3178:37) 

相关代码在这里(在 Coffeescript 中):

Plnnr.ApplicationRoute = Ember.Route.extend(
  model: ->
    @store.find('stage')
)

Plnnr.Stage = DS.Model.extend(
  tasks:        DS.hasMany("task")
  name:         DS.attr("string")
  description:  DS.attr("string")
  position:     DS.attr("number")
)

Plnnr.ApplicationAdapter = DS.ActiveModelAdapter.extend(
  namespace: 'v1'
) 

API 使用 Rails Serializer 设置,设置断点表明 Adapter 正在成功检索数据。

我还在 Ember-data.js 中设置了一个断点,位于故障开始的原点(当在下面的代码中调用 .normalize 时):

var normalizedArray = map.call(payload[prop], function(hash) {
  return typeSerializer.normalize(type, hash, prop);
}, this);

那时,type = DS.Model 和 hash = 序列化的 API 有效负载。

我是 Ember 新手,不熟悉如何解释文档。有谁知道可能出了什么问题,并对我如何追踪问题有任何建议?

谢谢!

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    原来问题是因为我在 Ember 中使用 Coffeescript。

    我这样声明了我的 ember Task 类:

    class Plnnr.Task extends DS.Model
    

    而不是

    Plnnr.Task = DS.Model.extend
    

    这两个不是等价的。虽然 Stage 正确使用了第二个约定,但 Task(属于 Stage)却错误地使用了第一个约定。当 JSON 包含 Stage 和 Task 对象返回时,序列化程序抛出上面的跟踪,因为它无法正确处理 Plnnr.Task 解析

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多