" undefined不是一个函数"用于CP和didInsertElement

时间:2015-04-01 17:51:26

标签: ember.js ember-cli

我正在将一个JS组件包装到Ember Addon中,这是我以前做过很多次的事情,然而我在一开始就遇到了一个问题让我担心这可能是“神奇”的余哥有点转移?无论如何希望可以解释为什么以下:

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计算属性中失败说:

  

未捕获的TypeError:undefined不是函数

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

我正在使用Ember 1.11.0,Ember-CLI 0.2.2。

1 个答案:

答案 0 :(得分:5)

你在这里与Ember CLI 0.2.2有关。来自the changelog

  

Addons现在默认包含ember-disable-prototype-extensions,这样可以确保加载项的编写方式与消费者原型扩展首选项无关。

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

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

成为这些:

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

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