38

Angular 2 でグローバル定数を実装するための解決策として、「不透明なトークン」に遭遇しています。

docsを読んでも、ポイントを把握できないようです。

複数のプロバイダーが同じ文字列を 2 つの異なるトークンとして使用すると衝突が発生する可能性があるため、文字列をトークンとして使用するよりも OpaqueToken を使用することをお勧めします。

何?そもそもAngular2トークンとは? 私がGoogleで得たのは、JSON Webトークン(認証における役割など)に関する回答だけです。これは理解していますが、明らかに関係はありません。

不透明なトークンとは何ですか? それは何のために使用されますか?

PS定数を提供するために使用される不透明なトークンに関するその他のドキュメント。しかし、彼らは私をあまり助けませんでした。

4

4 に答える 4

66

Angular4 を更新する

Angular4OpaqueTokenでは廃止され、 に置き換えられInjectionTokenます。InjectionToken では、ジェネリック型パラメーターを渡すことができます。

export let APP_CONFIG = new InjectionToken<MyConfig>("app.config");

こちらもご覧ください

オリジナル

何?そもそもAngular2トークンとは?

不透明なトークンとは何ですか? それは何のために使用されますか?

トークンは、Angulars 依存性注入のプロバイダーのキーです。プロバイダーはキーで登録され、DI によってインスタンス化されたコンポーネント、ディレクティブ、およびサービス クラスは、プロバイダー キーによって検索される依存関係が注入されます。

DI は、型、文字列、OpaqueTokenおよびオブジェクトをキーとしてサポートします。

export let APP_CONFIG = new OpaqueToken("app.config");

export let APP_CONFIG_2 = {};

providers: [
  MyService, // type is key and value
  {provide: MyService, useClass: MyFancyServiceImpl}, // type is key, `MyFancyServiceImpl` is the value (or rather the information how to create the value
  {provide: 'myservice', useClass: MyService}, // key is a string
  {provide: APP_CONFIG, useValue: {a: 'a', b: 'b'}} // key is an `OpaqueToken`
  {provide: APP_CONFIG_2, useValue: {a: 'a', b: 'b'}} // key is an object

]
// one of these decorators needs to be added to make DI work
@Injectable()
@Component()
@Directive()
@Pipe()
class MyComponent {
  // DI looks up a provider registered with the key `MyService` 
  constructor(private myService: MyService) {} 

  // Same as before but explicit
  constructor(@Inject(MyService) private myService: MyService) {} 

  // DI looks up a provider registered with the key 'myService'
  constructor(@Inject('myservice') private myService: MyService) {} 

  // DI looks up a provider registered with the `OpaqueKey` `APP_CONFIG`
  constructor(@Inject(APP_CONFIG) private myConfig: any) {} 

  // DI looks up a provider registered with the object `APP_CONFIG_2`
  constructor(@Inject(APP_CONFIG_2) private myConfig: any) {} 

オブジェクト キー ( APP_CONFIG_2) とOpaqueToken( APP_CONFIG) は、まったく同じインスタンスである必要があります。同じコンテンツの別のインスタンスは機能しません。これにより、キーが宣言されている場所と、プロバイダーとインジェクション ターゲットが同じキーを使用しているかどうかを簡単に調べることができます。

文字列の場合、異なるインスタンスになる可能性があります。これにより、同じ文字列値が異なるモジュールで使用され、競合や間違ったプロバイダーが注入される可能性があるというリスクが生じます。

于 2017-01-21T17:12:13.103 に答える