我目前正在使用不透明的令牌。我首先在项目的 common 部分定义一个 opaque token 如下:
import { InjectionToken } from '@angular/core';
export let JQ_TOKEN = new InjectionToken<any>('jQuery');
然后我将其导入如下:
import { JQ_TOKEN } from './common/index'; // (I'm using barrels for this import)
// 然后我将 jquery 定义为 $window 对象:
let jQuery: Object = window['$'];
// 然后在应用程序提供程序中,我有以下内容:
{ provide: JQ_TOKEN, useValue: jQuery },
// 然后,我将令牌导入到组件中:
import { JQ_TOKEN } from '../jQuery.service';
// 并按如下方式注入
constructor(@Inject(JQ_TOKEN) private $: any) {}
这使我能够使用智能感知定义接口,例如:
import { OpaqueToken } from '@angular/core';
export let TOASTR_TOKEN = new InjectionToken('toastr');
export interface Toastr {
success (msg: string, title?: string): void;
info (msg: string, title?: string): void;
warning (msg: string, title?: string): void;
error (msg: string, title?: string): void;
}
上述解决方案非常有效,除非我想使用 aot 进行生产构建。有没有解决的办法?也就是说,以下工作:
ng build --prod --aot false
但这有运行时错误:
ng build --prod
我使用 angular 4.3.4 和 cli 的 1.2.8。
我知道我可能会使用插件,但我宁愿不这样做,因为这将意味着对项目进行大量更改并且可能有它自己的错误。我查看了 angular 的 toastr 插件,发现它在调用页面导航时一直消失,尽管它是在页面导航之后调用的。如果我使用 OpaqueToken,则不会出现同样的问题。