Angularのコンテキスト外でInjectableを利用する方法 #18
-
v14でEnvironmentInjectorなどのAPIが導入され、よりサービスのDIがしやすくなりました。 私の認識では、 具体的なケースとしては次のようなコードになります。 import { EnvironmentInjector, inject } from '@angular/core';
import { LoadingController } from '@ionic/angular';
import { OperatorFunction, pipe, switchMap, finalize } from 'rxjs';
/**
* Observableの非同期処理内でIonicのLoadingControllerを使いやすくするためのRxJS用カスタムパイプ。
*
* - completeしないobservableに対しては使えないので注意
*
* @exmaple
* this.http.get('/example.com').pipe(loading()).subscribe();
*/
export const loading = <T>(): OperatorFunction<T, T> => {
const environment: EnvironmentInjector = inject(EnvironmentInjector); // <- ここでエラーが出てそもそもEnvironmentInjectorをDIできない
const loadingController: LoadingController = environment.runInContext(() => inject(LoadingController));
const loadingPromise: Promise<HTMLIonLoadingElement> = loadingController.create();
return pipe(
switchMap(async (value) => {
await (await loadingPromise).present();
return value;
}),
finalize(() => loadingPromise.then((loading) => loading.dismiss()))
);
}; 「 このような用途でサービスを利用することは叶わないのでしょうか。 最悪 関連/参考 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
そのとおりです。そこでinjectしておいた |
Beta Was this translation helpful? Give feedback.
そのとおりです。そこでinjectしておいた
EnvironmentInjector
を保持しておいてあとで任意のコンテキストで呼び出すためのAPIです