Angular 2 将参数传递给构造函数抛出 DI 异常

标签 angular angular2-directives

我想在我的构造函数中的组件上设置一个字符串属性,但是当我尝试这样的事情时

@Component({
    selector: 'wg-app',
    templateUrl: 'templates/html/wg-app.html'
})
export class AppComponent {

    constructor(private state:string = 'joining'){

    }
}

我得到一个 DI 异常

    EXCEPTION: No provider for String! (AppComponent -> String)

很明显,注入(inject)器正在尝试查找“字符串”提供程序,但找不到。

我应该为这类事情使用什么样的模式?例如。将初始参数传递给组件。

应该避免吗?我应该注入(inject)初始字符串吗?

最佳答案

您可以使用 @Input() 属性。

<my-component [state]="'joining'"></my-component>

export class AppComponent {
  @Input() state: string;
  constructor() { 
    console.log(this.state) // => undefined
  }
  ngOnInit() {
    console.log(this.state) // => 'joining'
  }
}

构造函数通常只用于 DI...

但如果你真的、真的需要它,你可以创建可注入(inject)变量 (plunker) :

let REALLY_IMPORTANT_STRING = new OpaqueToken('REALLY_IMPORTANT_STRING');
bootstrap(AppComponent, [provide(REALLY_IMPORTANT_STRING, { useValue: '!' })])

export class AppComponent {
  constructor(@Inject(REALLY_IMPORTANT_STRING) public state: REALLY_IMPORTANT_STRING) { 
    console.log(this.state) // => !
  }
}

最简单的选择是只设置类属性:

export class AppComponent {
  private state:string = 'joining';
  constructor() { 
    console.log(this.state) // => joining
  }
}

正如@Mark 所指出的,另一种选择是使用服务:

export class AppService {
  public state:string = 'joining';
}
export class AppComponent {
  constructor(private service: AppService) { 
    console.log(this.service.state) // => joining
  }
}

关于Angular 2 将参数传递给构造函数抛出 DI 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518141/

相关文章:

javascript - Angular 4路由器返回未定义

angular - 发现文档中的发行者无效,预期为 : angular-oauth2-oidc with Azure B2C

angular - 为什么 (ngModel) 不工作?

angular2-directives - 角度 2 : *ngFor variant

angular - 使用angular4下载pdf格式的网页

Angular 2 Resolve 只工作一次

android - Ionic Live Reload Capacitor Gradle 构建 - 失败!找不到 Java 运行时

angular - 如何以最有效的方式提取ViewContainerRef和ComponentRef?

Angular 7 react 形式绑定(bind)拦截

typescript - Angular2通过属性将函数传递给指令