1

我目前正在使用不透明的令牌。我首先在项目的 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,则不会出现同样的问题。

4

0 回答 0