Ember.js “巴别塔正在出口”;这";在ember computed属性中未定义

Ember.js “巴别塔正在出口”;这";在ember computed属性中未定义,ember.js,ember-cli,babeljs,Ember.js,Ember Cli,Babeljs,使用ember-cli@0.2.7和emberjs@1.13.2 源模型 export default DS.Model.extend({ name: DS.attr('string'), displayName : Ember.computed('name', () => { return this.get('name'); }) }); 翻译模型 'use strict'; var _this = undefined; exports['de

使用
ember-cli@0.2.7
emberjs@1.13.2

源模型

export default DS.Model.extend({
    name: DS.attr('string'),

    displayName : Ember.computed('name', () => {
      return this.get('name');
    })
});
翻译模型

'use strict';

var _this = undefined;

exports['default'] = DS['default'].Model.extend({
    name: DS['default'].attr('string'),

    displayName: Ember.computed('name', function () {
        return _this.get('name'); //at this point _this is undefined
    })
});

问题是,这永远不会成为一种模式。为什么会出现这种情况?

巴贝尔将其导出为未定义,因为您使用fat arrow函数保留的上下文未定义

您目前拥有的与以下内容没有区别:

let options = {
    name: DS.attr('string'),

    displayName : Ember.computed('name', () => {
      return this.get('name');
    })
};
console.log(this); // undefined
export default DS.Model.extend(options);
本例中的上下文未定义。您正在将选项传递给DS。模型对象尚不存在

export default DS.Model.extend({
    name: DS.attr('string'),

    displayName : Ember.computed('name', function() {
      return this.get('name');
    })
});
另一方面,由于您使用的是ember,所以让我们利用ES6解构来让代码看起来“更好”:

import Ember from 'ember';
import DS from 'ember-data';

const { computed } = Ember;
const { attr, Model } = DS;

export default Model.extend({
    name: attr('string'),

    displayName : computed('name', function() {
      return this.get('name');
    })
});

所以对我来说,只有在函数内部才能使用新的箭头构造。我本以为“this”在这两种情况下都是指父对象。
()=>{}
===
函数(){}.bind(this)
在您的情况下
this
==
未定义
,还没有父对象,您正在将选项对象传递给
DS.Model
尚未创建
DS.Model
实例。您仅在希望保留上下文或上下文无关紧要时使用胖箭头(美学原因)更新版本的余烬数据允许您只导入所需的类,如:
import attr from'ember data/attr'
从“余烬数据/模型”导入模型。您可以查看最新的ember cli蓝图以了解更多示例。