带有(ES6)类和继承的Angular.js DI

Posted

技术标签:

【中文标题】带有(ES6)类和继承的Angular.js DI【英文标题】:Angular.js DI with (ES6) classes and inheritance 【发布时间】:2015-05-14 18:57:21 【问题描述】:

背景,我们应用程序中类/模块的当前实现是 common.js 和 CoffeeScript 类。我正在拼命寻找与 ES6 或 TypeScript 一起使用的解决方案,但问题仍然存在。

如何使用 Angular-1.x 进行类继承的 DI?

给定代码:

// SuperService.js
class SuperService 
  constructor($http, $q, $etc) 
    // Implementation is not important ...  
     

export  SubService 

// SubService.js
import  SuperService  from './SuperService';
class SubService extends SuperService 
  constructor($more, $di, $things, $here) 
    // Implementation is not important ... 
    // // // // // // // // // // 
    // Problem exists here ... //
    // // // // // // // // // //
    super($we, $need, $all, $the, $super, \
          $class, $di, $things, $every, $time, $we, \
          $inherit, $from, $it)
  

export  SubService 

必须的,在SubService这里重新定义所有父DI要求才能成功调用super()

我们目前正在做类似于以下的事情:

// CoffeeScript                              // javascript
app.factory "subService", (Service) ->       app.factory("subService", function(Service) 
  SubService = () ->                           var SubService;
    Service.call(@)                            SubService = function() 
    @                                            Service.call(this);
                                                 return this;
  # Overwrite some stuff on the "Service"      ;
  Service::basepath = "/environments"          Service.prototype.basepath = "/environments";
  Service::model = Environment                 Service.prototype.model = Environment;
                                               return new SubService();
  new SubService()                           );

除了丑陋之外,这也不太理想。

【问题讨论】:

您找到解决方案了吗?我们也在以类似的方式接近它,但必须有更好的方法。 正是因为这个原因,我的团队还没有为我们的 Angular 东西切换到 ES6,我们希望这将在 ng-2.0 中的 typescript move 中以某种方式得到解决,但是我们'还没有看到任何解决这个问题的方法。 与大多数其他地方一样,在 AngularJS 中,我认为使用组合而不是继承更容易且更具可读性。 【参考方案1】:

在 SubService.js 的最底部添加这个

SubService.$inject = ['$http', '$q', '$etc', '$more', '$di', '$things', '$here'];

【讨论】:

【参考方案2】:

它不是 ES6(它是 ES7),但它可能会让你的船浮起来

我会通过MikeRyan52 调查angular-decorators。

他组装了一个 @inject 装饰器,其工作原理如下:

@inject('$http', '$rootScope')
class SomeClass 
  constructor($http, $rootScope) 

  


@inject('$q')
class SubClass extends SomeClass 
  constructor($q, ...parentDependencies)  /** parent dependencies caught with a rest parameter **/
    super(...parentDependencies);
  

the implementation of @inject

【讨论】:

太好了,感谢您的提示,我认为当您开始将 angular2 功能反向移植回 angular 功能时,最好花时间进行升级 :) 但仍然很高兴看到概念验证,并有选择的余地。

以上是关于带有(ES6)类和继承的Angular.js DI的主要内容,如果未能解决你的问题,请参考以下文章

ES6 -类和继承

es6中Class类和继承-示例

导入的类不能在带有 TypeScript 的 Angular.js 中用作服务

ES6中的类和对象继承

ES6中的类和对象继承

在带有 loadClass 的打字稿中使用 es6 类和猫鼬