我想使用 FactoryProvider ,它可以根据当前URI选择服务实现。
此外,其中一种实现方式需要对路由参数(由route/:parameter
定义)做出反应。
如下所示,我订阅了不幸的是,我无法以这种方式访问参数。在主路由器出口中实例化的组件可以访问它们,但是FactoryProvider无法访问它们。
有什么我可能想念的吗?
模块代码(为提高可读性而缩写)
@NgModule({
declarations: [],
imports: [],
exports: [],
providers: [XServiceProvider],
entryComponents: []})
工厂提供者
export const XServiceProvider = {
provide: XService,
useFactory: XServiceFactory,
deps: [Http, HttpService, ConfigurationService, DatePipe, Router, ActivatedRoute]
};
const XServiceFactory = (http: Http,
httpService: HttpService,
configuration: ConfigurationService,
datePipe: DatePipe,
router: Router,
activatedRoute: ActivatedRoute) => {
const useAlternateImpplementation= router.url.startsWith('/mg/');
if (useAlternateImpplementation === true) {
const service = new XyService(http, httpService, configuration, datePipe);
for (const child of activatedRoute.root.children) {
if (child.outlet === PRIMARY_OUTLET) {
child.url.subscribe(params => {
service.setParam(params[parameter]);
});
}
}
return service;
}
return new XService(http, httpService, configuration, datePipe);
};
答案 0 :(得分:0)
通过将依赖项注入范围从Singleton更改为Transient解决了该问题。
方法如下:
代码示例:
@NgModule({
declarations: [],
exports: [],
providers: [ /* remove here! */ ]
})
//...
@Component({
selector: '...',
templateUrl: '...',
styleUrls: ['...'],
providers: [XServiceProvider] /* add here */
})
//...
(可能是)以下原因:
我受blog post的启发尝试了这一点。
不过,我仍然不知道如何访问超出渲染到主要出口的组件范围的路由参数。