我有一个名为workspace
的组件,它应该提供名为DbService
的服务。
此服务旨在由workspace
的子组件使用。
DbService
有一个参数path
。
我希望能够按如下方式初始化我的组件:
<workspace db="/a/b/c"></workspace>
<workspace db="/d/e/f"></workspace>
并确保在工作空间中初始化的每个DbService
提供程序都可以在其构造函数中访问db属性值。
dbService也是异步初始化的。理想情况下,应在dbService完全初始化后初始化子组件。
到目前为止,我尝试过许多不同的事情,但没有成功。
使用来自组件属性的参数异步初始化Provider
的建议方法是什么?
答案 0 :(得分:0)
这不是DI可以单独处理的事情,因为在实例化服务时属性不可用。
解决方法是
class DbServiceContainer {
instance: DbService;
}
@Component({
...
providers: [DbServiceContainer]
})
class WorkspaceComponent {
constructor(@Attribute('db') db, dbServiceContainer: DbServiceContainer) {
dbServiceContainer.instance = new DbService(db);
}
}
@Component({ ... })
class WorkspaceChildComponent {
dbService: DbService;
constructor(dbServiceContainer: DbServiceContainer) {
this.dbService = dbServiceContainer.instance;
}
}
答案 1 :(得分:0)
在工作空间组件中使用@input db:string变量并将db变量设置为使用工作空间组件的位置。
代表:
<workspace [db]="/a/b/c"></workspace>
@Component({
selector: 'workspace',
template: `
{{db}}
`
})
export class HeroChildComponent {
@Input() db: string;
}
答案 2 :(得分:0)
在DbService上有一个明确的return "Module Code = " + moduleCode + "\n" + "Result = " + result;
方法,然后执行以下操作:
init
<workspace [db]="a/b/c"></workspace>
答案 3 :(得分:0)
您要做的是将组件更改检测策略设置为OnPush。基本上做的是变化检测只会在输入变化时运行。下一部分是将要在组件中运行的任何逻辑挂钩到ngOnChanges()
方法中,每次通过您控制的输入对组件进行水合时都将触发,因此您的数据库服务将始终使用正确的路径进行初始化:
import {Component, ChangeDetectionStrategy} from "@angular/core";
@Component({
changeDetection: ChangeDetectionStrategy.OnPush
})
export class WorkspaceComponet
{
@Input() db;
constructor(private dbService: DbService)
{
}
ngOnChanges()
{
this.dbService.init(this.db)
}
}