如何初始化将角色2中的组件属性作为参数传递的提供者

时间:2016-10-26 21:33:47

标签: angular dependency-injection

我有一个名为workspace的组件,它应该提供名为DbService的服务。 此服务旨在由workspace的子组件使用。 DbService有一个参数path

我希望能够按如下方式初始化我的组件:

<workspace db="/a/b/c"></workspace>
<workspace db="/d/e/f"></workspace>

并确保在工作空间中初始化的每个DbService提供程序都可以在其构造函数中访问db属性值。 dbService也是异步初始化的。理想情况下,应在dbService完全初始化后初始化子组件。

到目前为止,我尝试过许多不同的事情,但没有成功。

使用来自组件属性的参数异步初始化Provider的建议方法是什么?

4 个答案:

答案 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)
    }

}