【问题标题】:automatic class binding of es6 spread operator to constructores6扩展运算符到构造函数的自动类绑定
【发布时间】:2015-07-25 10:34:26
【问题描述】:

我正在使用 angular、jspm 和 es6。我正在使用一个基类将依赖项注入构造函数并自动在“this”上注册。

这实际上是当你扩展基础组件类时存在于 React 中的一种模式。我在这里找到了这家伙的小捷径:http://www.newmediacampaigns.com/blog/refactoring-react-components-to-es6-classes

我正在寻找一种使用 Angular 执行此操作的方法,使用 es6 类将注入的依赖项绑定到构造函数的“this”。

class baseClass {
    constructor(...injections) {
        this._bind(injections)
    }

    _bind(injections) {
        injections.forEach( (injection) => { 
            this[injection.name] = injection;
        });
    }   
}

class DiClass extends baseClass {
    constructor($q, SomeAngularFactory) {
        super($q, SomeAngularFactory);
    }
}

这显然不起作用(injection.name 不是一个东西,我知道)......但它几乎可以。我的问题是如何获得注入函数或对象的“名称”。在这个例子中,_bind 函数只是给你原始对象或函数......我不知道如何将“$q”或“SomeAngularFactory”作为字符串。

可以通过使用“Object.getOwnPropertyNames(...injections)”来获得它,但不能在 _bind 函数内。

感谢您的任何反馈或想法。

【问题讨论】:

  • 您可以从函数的字符串表示中解析变量名称。 应该你这样做吗?可能不会。

标签: angularjs dependency-injection ecmascript-6


【解决方案1】:

你可以这样做:

class baseClass {
  constructor(injections) {
    Object.assign(this, injections);
  }
}

class DiClass extends baseClass {
  constructor($q, SomeAngularFactory) {
    super({ $q, SomeAngularFactory });
  }
}

Obs.:与类一样,Object.assign 是 ES2015 的一个特性,它将第二个(参数)对象合并到第一个对象中。

【讨论】:

    【解决方案2】:

    在 AngularJS 中,这个可注入参数仅在开发模式下有效。如果你去生产并缩小你的脚本,所有的注入都应该保存到特殊的属性中。您可以在angular docs 中了解更多信息。这里是如何与角度控制器一起工作的

    function MyController($q, SomeAngularFactory) {
    }
    MyController.$inject = ['$q', 'SomeAngularFactory']
    

    Angular 2.0 将使用 TypeScript 和 will use annotations 来描述可注入变量。目前在 anguar 1.3 中你仍然可以添加静态属性 $inject

    class DiClass extends baseClass {
       constructor($q, SomeAngularFactory) {
         super($q, SomeAngularFactory);
       }
    }
    DiClass.$inject = ['$q', 'SomeAngularFactory'];
    

    【讨论】:

      【解决方案3】:

      Angular 有一个内置方法$injector.annotate(fn),它用于依赖注入,并允许您获取传递给它的函数的参数。您可以使用它来获取所有constructor() 参数的名称,然后使用$injector.get() 来检索它们(这在性能方面应该很好,因为它们被缓存了)。

      这是另一个线程中的link to answer,以及带有演示的直接link to a fiddle

      【讨论】:

        猜你喜欢
        • 2018-02-06
        • 2019-09-26
        • 2018-06-18
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        相关资源
        最近更新 更多