2016-04-08 54 views
1

我有一个非常严重的问题。我正在尝试在我的Angular 1应用程序中使用ES6导入和TypeScript。但随着角度喷射许多ES6进口未使用。这里有一个例子:SystemJs和ES6进口角度服务

服务 -

export class MyService { 
public doStuff() {} 
} 

控制器 -

import {MyService} from './service'; 

export class MyController { 
    public constructor(private MyService: MyService) {MyService.doStuff();} 
} 

注意,如果我重新命名使用as进口也没关系。

这里的问题是,编译器不认为MyService导入正在使用!所以编译后的代码systemjs不包括它 -

System.register('myController', [], function() { ... }); 

为了解决这个问题,我可以做出MyService静态的方法和从不使用角注入它。例如:

import {MyService} from './service'; 

export class MyController { 
    public constructor() {MyService.doStuff();} 
} 

但是我们没有时间这样做。我们正试图通过一步步完成这个重构,尽管这是最终目标,但目前我们没有时间。

我该如何强制systemjs包括这些?

回答

2

从副作用的TypeScript Handbook

导入模块只

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

import "./my-module.js";

0

来处理这个正确的方法是前,应用程序启动时注册到angular.service服务。 TypeScript正在消除导入,因为它仅用于类型位置,而不是用于值的位置。这不适用于"module": "system",但适用于所有外部模块目标。

以下是我已经在多个生产应用成功用于

我-service.ts

export class MyService { 
    doStuff() {} 
} 

我-controller.ts

import {MyService} from './service'; 

export class MyController { 

    static $inject = ['MyService']; 

    constructor(private myService: MyService) { 
    myService.doStuff(); 
    } 
} 

我的应用程序内。TS

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 }); 
} 

为了解释,服务本身需要被以与角模块注册首先被注入,所以消隐进口是自登记代码的非问题,在所示我-app.ts,在将其作为参数传递给angular.service时,在价值位置使用MyService

一个很好的模式是在一个地方注册组成一组功能的所有服务。要做到这一点的逻辑地点是在包含角色模块的文件中,该角色模块将保存服务。

另请注意,static $inject = ['MyService'];这可确保您的控制器代码安全地缩小,同时允许您将DI注释与需要它的构造函数共同定位。

我发现这种模式非常好。