Angular如何在main.ts的catch语句中访问注入器树?
解决方案
因为bootstrapModule的catch块捕获的是模块初始化阶段的错误,此时AppModule的注入器还未完全构建完成,无法直接获取模块内注册的服务。可以通过以下两种方式实现需求:
方法一:手动创建小型注入器
在catch块中手动构建仅包含ErrorHandlerService及其依赖的注入器,直接实例化并使用服务:
import { enableProdMode, Injector } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import './component-map'; import { environment } from './environments/environment'; import { ErrorHandlerService } from './app/services/error-handler.service'; import { HttpClient, HttpXhrBackend } from '@angular/common/http'; if (environment.production) { enableProdMode(); } platformBrowserDynamic() .bootstrapModule(AppModule) .catch((err) => { // 手动创建注入器,注册ErrorHandlerService及其依赖 const injector = Injector.create({ providers: [ ErrorHandlerService, // 若ErrorHandlerService依赖HttpClient,需手动提供实例 { provide: HttpClient, useValue: new HttpClient(new HttpXhrBackend({ build: () => new XMLHttpRequest() })) } // 添加其他必要的依赖服务 ] }); // 获取服务并处理错误 const errorHandler = injector.get(ErrorHandlerService); errorHandler.sendError(err); console.error(err); });
这种方式适合依赖较少的服务,缺点是如果ErrorHandlerService依赖较多,手动维护注入器会比较繁琐。
方法二:在平台注入器中注册服务
先在Angular平台注入器中注册ErrorHandlerService,这样无论模块初始化成功与否,都能从平台注入器中获取服务:
import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import './component-map'; import { environment } from './environments/environment'; import { ErrorHandlerService } from './app/services/error-handler.service'; import { HttpClientModule } from '@angular/common/http'; if (environment.production) { enableProdMode(); } // 创建平台时注册所需服务(包括依赖模块) const platform = platformBrowserDynamic([ ErrorHandlerService, // 若依赖HttpClientModule,需注册模块的提供者 ...HttpClientModule.forRoot().providers ]); platform.bootstrapModule(AppModule) .catch((err) => { // 从平台注入器中获取服务 const errorHandler = platform.injector.get(ErrorHandlerService); errorHandler.sendError(err); console.error(err); });
这种方式更简洁,适合依赖较多的服务,平台注入器会负责管理服务的实例化和依赖注入。需要注意的是,若ErrorHandlerService依赖其他Angular模块(如HttpClientModule),需要将模块的提供者一并注册到平台注入器中。
内容的提问来源于stack exchange,提问作者Daryll Santos
相关产品推荐
相关产品推荐

