【问题标题】:"undefined is not a function" for CP and didInsertElementCP 和 didInsertElement 的“未定义不是函数”
【发布时间】:2015-04-02 02:43:35
【问题描述】:

我将一个 JS 组件包装到一个 Ember 插件中,我以前做过很多次,但我一开始就遇到了一个问题,这让我担心可能是ember 有轻微的偏移?无论如何希望可以解释以下原因:

import Ember from 'ember';
import layout from '../templates/components/nav-menu';

export default Ember.Component.extend({
  layout: layout,
    tagName: 'nav',
  classNames: ['navmenu','navmenu-default','navmenu-fixed-left'],
  attributeNames: ['role:navigation'],
  classNameBindings: ['offcanvas'],
  hideAt: null,
  offcanvas: function() {
    let hideAt = this.get('hideAt');
    if(!hideAt) {
      return 'offcanvas';
    } else {
      return 'offcanvas-%@'.fmt(hideAt);
    }
  }.property('hideAt'),

  _initialize: function() {
    this.$().offcanvas();
  }.on('didInsertElement')
});

这在两个方面失败了。照原样在 offcanvas 计算属性中失败说:

Uncaught TypeError: undefined is not a function

很奇怪,但它变得更奇怪了。如果删除此计算属性,则它会在 _initialize() 调用中失败,并出现相同的“未定义不是函数”错误:

我使用的是 Ember 1.11.0,Ember-CLI 0.2.2。

【问题讨论】:

  • 你是否碰巧禁用了原型扩展?
  • 我只用这个组件创建了一个全新的“插件”并得到了相同的结果。我想知道 Ember-CLI 0.2.2 是否有问题:(
  • 确实感觉原型扩展被阻止了,但我没有关闭它们。

标签: ember.js ember-cli


【解决方案1】:

你说得对,这与 Ember CLI 0.2.2 有关。来自the changelog:

插件现在默认包含 ember-disable-prototype-extensions,这确保插件的编写方式无论消费者原型扩展偏好如何都能正常工作。

我看到了他们做出改变背后的原因,这完全有道理。您现在需要使用Ember.computed 和Ember.on 来创建您的属性和观察者。所以这些:

initialize: function() {}.on('didInsertElement'),
offcanvas: function() {}.property('hideAt')

成为这些:

initialize: Ember.on('didInsertElement', function() {}),
offcanvas: Ember.computed('hideAt', function() {})

您可以阅读有关禁用原型扩展的更多信息here。

【讨论】:

  • 谢谢,我正在为这件事情拉头发……刚刚摆脱了 3 天的严重流感,我想也许我在这个过程中失去了理智 :)
  • @glk 我认为这种方法是有道理的,但即使在不再使用原型扩展之后,虚拟测试应用程序也会给我一些很难调试的错误,我怀疑这些错误也是由这种变化引起的。
  • 例如,同样的“未定义不是函数”会影响 ember-debug 的源映射的 sourceMapCache 计算属性。
  • 我的建议是重新打开原型扩展(现在)。大多数插件都会使用它们,所以如果你和其他插件一起使用你的插件,你会遇到问题。但是,我怀疑大多数流行的插件将在几周内更新,此时您应该能够将其关闭。 (另外,仅供参考,.fmt() 功能不适用于禁用扩展。)
  • 啊,fmt 很好。也许是时候使用 ES6 模板字符串了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2016-10-04
  • 2015-06-27
  • 2018-05-14
相关资源
最近更新 更多