Angularjs 角度服务的SystemJs和ES6导入
我有一个相当严重的问题。我正在尝试在Angular 1应用程序中实现ES6导入和TypeScript。但是有了角度注入,许多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
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 });
}