我正在将一个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。
答案 0 :(得分:5)
你在这里与Ember CLI 0.2.2有关。来自the changelog:
Addons现在默认包含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的更多信息。