AngularJSでデコレータが正確に何であるか興味があります。 AngularJSドキュメンテーション での宣伝文と youtube video での簡単な(興味深いものの)言及を除いて、デコレータに関するオンラインの情報はあまりありません。
Angular人が言うように、デコレータは次のとおりです。
サービスのデコレーションにより、デコレータはサービスインスタンスの作成を傍受できます。返されるインスタンスは、元のインスタンス、または元のインスタンスに委任する新しいインスタンスです。
私はそれがの意味を本当に知らないので、なぜこのロジックをサービス自体から分離するのか分かりません。たとえば、異なる条件下で異なるものを返したい場合、関連する関数に異なる引数を渡すか、そのプライベート状態を共有する別の関数を使用します。
私はまだAngularJS初心者なので、私が拾った無知や悪い習慣だけだと確信しています。
$provide.decorator
の適切な使用例は、モジュールを依存する一部のサードパーティ/アップストリームサービスでマイナーな「微調整」を行う必要がある場合です。ただし、サービスをそのまま残します(あなたはサービス)。 ここ はplunkrのデモです。
デコレータを使用すると、「インフラストラクチャ」コードを気にせずに、横断的な関心事を分離し、サービスが単一の責任原則を保持できるようになります。
デコレータの実際の使用:
これらのすべての場合において、サービス内のコードをその主な責任に制限します。
decorator
は、factory, service, value, provider
によって作成されたサービスインスタンスをインターセプトでき、オプションを使用して構成可能ではないinstance(service)
を変更するオプションを提供します。
また、$http
など、テスト用のモックアップインスタンスを提供することもできます。
簡単なWordでは、拡張メソッドのようなものだと言えます。例クラスがあり、2つのメソッドがあり、実行時にさらにメソッドを追加したい場合は、Decoratorを使用します。
$ provide.decoratorを定数と一緒に使用することはできません。なぜなら、それらが読み込み専用プロパティを保持している定数を変更できないからです。
短いデコレータでは、次のように説明できます。
デコレータ関数は、サービスの作成をインターセプトし、サービスの動作をオーバーライドまたは変更できるようにします。
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の回答に加えて。