Angularjs 角度服务的SystemJs和ES6导入

Angularjs 角度服务的SystemJs和ES6导入,angularjs,typescript,ecmascript-6,systemjs,Angularjs,Typescript,Ecmascript 6,Systemjs,我有一个相当严重的问题。我正在尝试在Angular 1应用程序中实现ES6导入和TypeScript。但是有了角度注入,许多ES6导入就不用了。以下是一个例子: 服务- export class MyService { public doStuff() {} } 控制器- import {MyService} from './service'; export class MyController { public constructor(private MyService: MySer

我有一个相当严重的问题。我正在尝试在Angular 1应用程序中实现ES6导入和TypeScript。但是有了角度注入,许多ES6导入就不用了。以下是一个例子:

服务-

export class MyService {
 public doStuff() {}
}
控制器-

import {MyService} from './service';

export class MyController {
  public constructor(private MyService: MyService) {MyService.doStuff();} 
}
请注意,如果使用
将导入重命名为
,这并不重要

这里的问题是编译器认为没有使用
MyService
导入!因此,生成的编译后的
systemjs
代码不包括它-

System.register('myController', [], function() { ... });
为了解决这个问题,我可以将
MyService
上的方法设置为静态,而不使用angular注入。例:

import {MyService} from './service';

export class MyController {
  public constructor() {MyService.doStuff();} 
}
但我们没有时间这么做。我们正在尝试分步进行重构,虽然这是最终目标,但目前我们没有时间进行重构

如何强制
systemjs
包含这些内容?

来自

仅针对副作用导入模块

虽然不是推荐的做法,但一些模块设置了一些可供其他模块使用的全局状态。这些模块可能没有任何出口,或者消费者对其出口不感兴趣。要导入这些模块,请使用:

导入“/mymodule.js”


正确的处理方法是在应用程序启动之前使用
angular.service
注册服务。TypeScript正在省略导入,因为它仅用于类型位置,而不用于值位置。这并不特定于
“模块”:“系统”
,但适用于所有外部模块目标

以下是我在许多生产应用程序中成功使用的内容

我的服务

my-controller.ts

my-app.ts

为了说明这一点,首先需要向angular模块注册服务本身,以便注入,因此省略的导入不是问题,因为my-app.ts中显示的注册代码在将其作为参数传递给
angular.service
时,在值位置使用
MyService

一个很好的模式是在一个地方注册包含一组特定功能的所有服务。这样做的逻辑位置是在包含将保存服务的angular模块的文件中

还要注意
static$inject=['MyService']这确保了控制器代码是小型化安全的,同时允许您将DI注释与需要它的构造函数共同定位

我发现这个图案的比例非常好

export class MyService {
  doStuff() {}
}
import {MyService} from './service';

export class MyController {

  static $inject = ['MyService'];

  constructor(private myService: MyService) {
    myService.doStuff();
  } 
}
import angular from 'angular';

import {MyController} from './my-controller';
import {MyService} from './my-service';

const app = angular.module('app', []);

app.controller({ MyController });
app.service({ MyService });

export function bootstrap(target: Document | Element) {
  angular.bootstrap(target, ['app'], { ngStrictDi: true });
}