web-dev-qa-db-ja.com

「デコレータ」とは何ですか、どのように使用されますか?

AngularJSでデコレータが正確に何であるか興味があります。 AngularJSドキュメンテーション での宣伝文と youtube video での簡単な(興味深いものの)言及を除いて、デコレータに関するオンラインの情報はあまりありません。

Angular人が言うように、デコレータは次のとおりです。

サービスのデコレーションにより、デコレータはサービスインスタンスの作成を傍受できます。返されるインスタンスは、元のインスタンス、または元のインスタンスに委任する新しいインスタンスです。

私はそれがの意味を本当に知らないので、なぜこのロジックをサービス自体から分離するのか分かりません。たとえば、異なる条件下で異なるものを返したい場合、関連する関数に異なる引数を渡すか、そのプライベート状態を共有する別の関数を使用します。

私はまだAngularJS初心者なので、私が拾った無知や悪い習慣だけだと確信しています。

147
Kevin Beal

$provide.decoratorの適切な使用例は、モジュールを依存する一部のサードパーティ/アップストリームサービスでマイナーな「微調整」を行う必要がある場合です。ただし、サービスをそのまま残します(あなたはサービス)。 ここ はplunkrのデモです。

217
tamakisquare

デコレータを使用すると、「インフラストラクチャ」コードを気にせずに、横断的な関心事を分離し、サービスが単一の責任原則を保持できるようになります。

デコレータの実際の使用:

  • キャッシュ:潜在的に高価なHTTP呼び出しを行うサービスがある場合、外部呼び出しを行う前にローカルストレージをチェックするキャッシュデコレーターでサービスをラップできます。
  • デバッグ/トレース:開発/プロダクション構成に応じて、デバッグまたはトレースラッパーでサービスを装飾するスイッチがあります。
  • スロットル:頻繁にトリガーされる呼び出しをデバウンスラッパーでラップします。たとえば、レート制限サービスと簡単にやり取りできます。

これらのすべての場合において、サービス内のコードをその主な責任に制限します。

66
JBland

decoratorは、factory, service, value, providerによって作成されたサービスインスタンスをインターセプトでき、オプションを使用して構成可能ではないinstance(service)を変更するオプションを提供します。

また、$httpなど、テスト用のモックアップインスタンスを提供することもできます。

10
Daiwei

簡単なWordでは、拡張メソッドのようなものだと言えます。例クラスがあり、2つのメソッドがあり、実行時にさらにメソッドを追加したい場合は、Decoratorを使用します。

$ provide.decoratorを定数と一緒に使用することはできません。なぜなら、それらが読み込み専用プロパティを保持している定数を変更できないからです。

3
Gurupreet

短いデコレータでは、次のように説明できます。

デコレータ関数は、サービスの作成をインターセプトし、サービスの動作をオーバーライドまたは変更できるようにします。

angularによって$provideサービスを使用し、別のサービスの実装を変更または置換します

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

例:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

用途

@JBlandの回答に加えて。

  • アプリケーション全体のロケール設定:-

    例を見つけることができます here

  • angular serviceによるサービスのデフォルトの動作と既存の実装の変更:-

    サンプルを見つけることができます こちら

  • 異なる環境での関数の動作の切り替え。

1
Samuel J Mathew