babel 6没有定义属性

时间:2017-05-16 10:23:28

标签: ember.js ecmascript-6 babel

我有一个ember-computed-decorators的Ember应用程序,我有这种模型:

import DS from 'ember-data';
import {alias} from 'ember-computed-decorators';

export default DS.Model.extend({
  @alias('customData.email') email
});

它适用于ember-cli-babel版本5,但我使用tranform-decorator-legacy更新到版本6,我有这样的错误:

email is not defined

我用一个简单的js脚本复制它:

function dec(target, name, descriptor) {
  const method = descriptor.value;

  descriptor.value = function(...args) {
    return 'hello';
  }
}

const Foo = {
  @dec test
}

console.log(Foo.test);

我也有同样的错误。

这有效:

function dec(target, name, descriptor) {
  const method = descriptor.value;

  descriptor.value = function(...args) {
    return 'hello';
  }
}

const Foo = {
  @dec
  test() {
    return 'test';
  }
}

console.log(Foo.test());

我认为@dec test很奇怪,但它适用于babel 5.解决方案是什么?

修改

以下是由ember生成的内容:

define('tiny/models/subscription', ['exports', 'ember-data', 'ember-computed-decorators'], function (exports, _emberData, _emberComputedDecorators) {
  function _createDecoratedObject(descriptors) { var target = {}; for (var i = 0; i < descriptors.length; i++) { var descriptor = descriptors[i]; var decorators = descriptor.decorators; var key = descriptor.key; delete descriptor.key; delete descriptor.decorators; descriptor.enumerable = true; descriptor.configurable = true; if ('value' in descriptor || descriptor.initializer) descriptor.writable = true; if (decorators) { for (var f = 0; f < decorators.length; f++) { var decorator = decorators[f]; if (typeof decorator === 'function') { descriptor = decorator(target, key, descriptor) || descriptor; } else { throw new TypeError('The decorator for method ' + descriptor.key + ' is of the invalid type ' + typeof decorator); } } } if (descriptor.initializer) { descriptor.value = descriptor.initializer.call(target); } Object.defineProperty(target, key, descriptor); } return target; }

  exports['default'] = _emberData['default'].Model.extend(_createDecoratedObject([{
    key: 'mail',
    initializer: function initializer() {
      return _emberData['default'].attr();
    }
  }, {
    key: 'email',
    decorators: [(0, _emberComputedDecorators.alias)('mail')],
    initializer: function initializer() {
      return email;
    }
  }]));
});

这是由ember-cli-babel第6版生成的内容:

define('tiny/models/subscription', ['exports', 'ember-data', 'ember-computed-decorators'], function (exports, _emberData, _emberComputedDecorators) {
  'use strict';

  Object.defineProperty(exports, "__esModule", {
    value: true
  });

  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
    var desc = {};
    Object['ke' + 'ys'](descriptor).forEach(function (key) {
      desc[key] = descriptor[key];
    });
    desc.enumerable = !!desc.enumerable;
    desc.configurable = !!desc.configurable;

    if ('value' in desc || desc.initializer) {
      desc.writable = true;
    }

    desc = decorators.slice().reverse().reduce(function (desc, decorator) {
      return decorator(target, property, desc) || desc;
    }, desc);

    if (context && desc.initializer !== void 0) {
      desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
      desc.initializer = undefined;
    }

    if (desc.initializer === void 0) {
      Object['define' + 'Property'](target, property, desc);
      desc = null;
    }

    return desc;
  }

  var _dec, _desc, _value, _obj, _init;

  exports.default = _emberData.default.Model.extend((_dec = (0, _emberComputedDecorators.alias)('mail'), (_obj = { email: email
  }, (_applyDecoratedDescriptor(_obj, 'email', [_dec], (_init = Object.getOwnPropertyDescriptor(_obj, 'email'), _init = _init ? _init.value : undefined, {
    enumerable: true,
    configurable: true,
    writable: true,
    initializer: function initializer() {
      return _init;
    }
  }), _obj)), _obj)));
});

我和babel 5的结果相同。

0 个答案:

没有答案