【问题标题】:ember-cli "TypeError: desc.get is not a function" after upgrade of ember-cliember-cli 升级后的 ember-cli "TypeError: desc.get is not a function"
【发布时间】:2015-06-04 14:22:33
【问题描述】:

使用 ember v.1.12.0 将 ember-cli 更新到 v0.2.7 后,我遇到了一些有趣的行为,在使用计算属性时会导致异常。

二手型号:

User = Ember.Object.extend
 md5: ""
 gravatar: (->
   return get_gravatar(@get("md5"))
   ).property("md5")

在路由器中调用u.get("gravatar")afterModel方法,我明白了:

u.get("gravatar")
ember.debug.js:15588 Uncaught TypeError: desc.get is not a function
    at Object.get (../vendor.js:26142:19)
    at exports.default.mixin.Mixin.create.get (../vendor.js:39811:27)
    at eval (eval at evaluate (unknown source), <anonymous>:1:3)
    at Object.InjectedScript._evaluateOn (<anonymous>:895:55)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluateOnCallFrame (<anonymous>:954:21)
    at afterModel (../v4.js:3438:16)
    at applyHook (../vendor.js:55667:32)
    at Object.HandlerInfo.runSharedModelHook (../vendor.js:53668:22)
    at Object.HandlerInfo.runAfterModelHook (../vendor.js:53651:21)

当深入挖掘时,我发现错误发生在 `ember.debug.js 的 getter 函数中。

function get(obj, keyName) {
  ...
  if (desc) {
    return desc.get(obj, keyName); 
    // -> Error while processing route: recipe_edit desc.get is not a function TypeError: desc.get is not a function
   } else {
   ...

desc 的类型与我直接调用 u.gravatar 时的类型相同,所以我不太清楚为什么这个问题不再得到解决。

desc: Object
  _cacheable: true
  _dependentKeys: Array[1]
  _readOnly: false
  isDescriptor: true
  __proto__: Object

【问题讨论】:

    标签: javascript ember.js ember-cli


    【解决方案1】:

    经过几个小时的调试,我自己找出了问题所在。我有一个序列化程序,它可以解析循环引用并从我的 Ember 对象中删除所有不必要的属性以将其转换为 JSON。

    在之前的 Ember 版本中它工作得很好,但在这个版本中,递归函数以某种方式通过 Object 进入一些 Ember 框架代码并在运行时从 Ember 框架中删除函数。 p>

    ComputedPropertyPrototype.volatile()
    ComputedPropertyPrototype.property()
    exports.default.mixin.Mixin.create.clear()
    exports.default.mixin.Mixin.create.popObject()
    exports.default.mixin.Mixin.create.shiftObject()
    ...
    

    因此,我得到了这些听起来很奇怪且难以调试的错误,因为属性的删除发生在它实际导致错误之前。

    hacky 序列化器对我来说很糟糕,但我希望这对你们中的一些人在遇到同样的错误时有所帮助。

    【讨论】: