我目前正在使用不透明令牌。我首先在项目的公共部分中定义一个不透明的标记,如下所示:
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) {}
这允许我用intellisense定义接口,例如:
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
我使用角度4.3.4和1.2.8的cli。
我知道我可能会使用插件,但我宁愿不这样做,因为这意味着对项目进行了很多更改,并且可能有自己的错误。我查看了角度的toastr插件,发现在调用页面导航时它仍然消失,尽管在页面导航后调用它。如果我使用OpaqueToken,则不会发生同样的问题。