对于CP和didInsertElement,"undefined不是函数"

ken*_*ken 1 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')
});
Run Code Online (Sandbox Code Playgroud)

这有两个失败.原样,它在offcanvas计算属性中失败说:

未捕获的TypeError:undefined不是函数

很奇怪,但它变得更奇怪.如果删除此计算属性,则在_initialize()调用时失败,并显示相同的"未定义不是函数"错误:

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

GJK*_*GJK 5

你是对的,这与Ember CLI 0.2.2有关.来自更改日志:

Addons现在默认包含ember-disable-prototype-extensions,这确保了加载项的编写方式无论使用者原型扩展首选项如何都可以.

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

initialize: function() {}.on('didInsertElement'),
offcanvas: function() {}.property('hideAt')
Run Code Online (Sandbox Code Playgroud)

成为这些:

initialize: Ember.on('didInsertElement', function() {}),
offcanvas: Ember.computed('hideAt', function() {})
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关禁用原型扩展的更多信息.