为什么需要重新打开组件类来指定位置参数?

aks*_*kst 5 javascript ember.js

在ember中为组件类指定位置参数时,你必须重新打开类(如下所示),这样它才能工作,你不能将它包含在初始声明中(至少从我看到的例子和我自己的经验中看到) ).

import Ember from 'ember';

const component = Ember.Component.extend({ });

component.reopenClass({
  positionalParams: ['post'],
});

export default component;
Run Code Online (Sandbox Code Playgroud)

如果你在单一声明(如下所示)中这样做,它将无法工作

import Ember from 'ember';

export default Ember.Component.extend({
  positionalParams: ['post'],
});
Run Code Online (Sandbox Code Playgroud)

问题

  • 这在设计过程中被忽略了吗?或者这是故意的(可能是为了阻止使用)?
  • 这是因为它是某种类的属性吗?有没有办法在类声明中指定类属性?

只是感觉很糟糕,我无法使它成为同一个表达式的一部分,并且必须将类分配给变量,重新打开它,然后最终导出它.


版本

  • ember.js @ 2.2

spe*_*ras 5

这是因为它是某种类的属性吗?

这个.该reopenClassextend方法不这样做同样的事情.

  • 传递给的属性reopenClass放在类本身的构造函数中:

    MyClass = Ember.Object.extend({});
    MyClass.reopenClass({ foo: 42 });
    obj = MyClass.create();
    
    console.log(obj.foo);              // undefined
    console.log(MyClass.foo);          // 42
    console.log(obj.constructor.foo);  // 42
    
    Run Code Online (Sandbox Code Playgroud)
  • extend另一方面,传递给的属性在实例上可用(*):

    MyClass = Ember.Object.extend({ foo: 42 });
    obj = MyClass.create();
    
    console.log(obj.foo);              // 42
    console.log(MyClass.foo);          // undefined
    console.log(obj.constructor.foo);  // undefined
    
    Run Code Online (Sandbox Code Playgroud)

(*)我不知道他们是否被复制或成为原型链的一部分.