如何在不重构项目时忽略Angular父模块的GRID_REDIRECT提供者
如何在Angular子模块中忽略父模块的GRID_REDIRECT提供者
要在不重构整体项目结构的前提下,让子模块完全忽略父模块配置的GRID_REDIRECT提供者,你可以利用Angular的提供者覆盖机制,直接在子模块中重新声明该令牌并设置为空值。
步骤1:在子模块中覆盖GRID_REDIRECT
修改ChildModule的providers数组,添加对GRID_REDIRECT的覆盖配置,使其返回undefined或空对象,这样子模块下的组件注入该令牌时会拿到空值,相当于“忽略”了父模块的配置:
// Child Module @NgModule({ declarations: [ SearchChildPageComponent, SearchGridComponent ], imports: [ SearchModule ], providers: [ { provide: SEARCH_DATA, useExisting: SearchGridTypeService, }, // 覆盖父模块的GRID_REDIRECT,使其返回undefined { provide: GRID_REDIRECT, useValue: undefined } ], }) export class ChildModule {}
可选优化:组件级可选注入(如需修改组件)
如果允许修改SearchGridComponent的代码,可以在注入GRID_REDIRECT时添加@Optional()装饰器,这样即使没有该提供者也不会抛出错误,同时实现只使用SEARCH_DATA的需求:
import { Component, Inject, Optional } from '@angular/core'; @Component({ selector: 'app-search-grid', templateUrl: './search-grid.component.html' }) export class SearchGridComponent { constructor( @Inject(SEARCH_DATA) private searchData: SearchGridTypeService, // 标记为可选注入,无提供者时返回undefined @Optional() @Inject(GRID_REDIRECT) private gridRedirect?: any ) { // 业务逻辑中仅使用searchData即可 } }
重要提示
你当前的代码存在一个Angular规则违反:SearchGridComponent同时在ParentModule和ChildModule的declarations数组中声明。Angular要求组件只能属于一个模块,若需跨模块使用,应将其放入共享模块并导出,再在父/子模块中导入共享模块。虽然你暂时不想重构,但长期来看这个问题会导致运行时错误,建议后续优化。
内容的提问来源于stack exchange,提问作者Branderson20
相关产品推荐
相关产品推荐

