gpt4 book ai didi

Angular:延迟加载模块不调用 InjectionToken 工厂

转载 作者:行者123 更新时间:2023-12-05 05:43:32 27 4
gpt4 key购买 nike

我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。

在这里https://github.com/MaurizioCasciano/Angular-Lazy-Injection/branches你可以找到相应的最小项目,有两个独立的分支:

  • app-provider-root(工作自定义 APP_BASE_HREF)
  • lazy-provider-root(无法使用自定义 APP_BASE_HREF)

您还可以尝试 StackBlitz 上的两个分支:

如果我将相同的代码片段移动到静态 AppModule,它会按预期被调用。

 providers: [
{
provide: APP_BASE_HREF,
useFactory: appBaseHrefFactory
}
]


export function appBaseHrefFactory() {
console.log("APP MODULE window.location.pathname: " + window.location.pathname);

return window.location.pathname;
}

如何强制延迟加载模块也提供 APP_BASE_HREF?

更新

如果我在模块构造函数中注入(inject)值,将调用工厂方法,但导入的模块/服务不会获取该值。

export class RemoteModule {
constructor(@Inject(APP_BASE_HREF) private apipBaseHref: string) {
console.log("Remote APP BASE HREF: " + appBaseHref);
}
}

最佳答案

如果您提供任何 token ,如 APP_BASE_HREF,或当前模块中的任何其他 token ,- 此 token 将仅适用于此模块及其子模块。不适合任何其他人。

要解决您的问题,您可以添加某种状态,例如服务:

@Injectable({
providedIn: 'root'
})
export class BaseHrefValueService extends BehaviorSubject<string> {
}

创建可重用的提供者,只是为了 DRY:

export const APP_BASE_HREF_PROVIDER = {
provide: APP_BASE_HREF,
useFactory: (service) => {
if (!service.value) {
service.next(window.location.pathname);
}

return service.value;
},
deps: [BaseHrefValueService]
}

然后将它注入(inject)到任何惰性模块中:

@NgModule({
...
providers: [APP_BASE_HREF_PROVIDER],
})
export class YourModule {}

关于Angular:延迟加载模块不调用 InjectionToken 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71803663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com