正确使用Angular TypeScript构造函数-无法解析所有参数

时间:2019-05-24 05:00:08

标签: angular typescript

@Injectable({
  providedIn: 'root',
  /* useFactory: () => new MyService(MyAnotherService.myInteger) */
})
export class MyService{

  constructor(private someInteger?: number) {
    // doThings with someInteger
  }

-自动构建将抱怨Warning: Can't resolve all parameters for...

实际上,由于有了useFactory: ()部分,我们仍然能够正确运行我们的应用程序。但是我不知道这是不是正确的方法

我们当然可以将构造函数更改为

constructor(private anotherService?: MyAnotherService) {
        // doThings with anotherService
      }

要关闭构建警告, 但是,我认为MyService只能依赖于原语时,不应该依赖MyAnotherService,这对于代码可重用性也是不利的

在这种情况下最好的办法是什么?

我的想法是。 Angular使用Decorator指示它是Angular组件(对吗?) 因此,主体逻辑主体不应该总是与Angular DI逻辑耦合,特别是如果它是一种服务。我们可以提取服务代码并将其插入其他地方(是否使用DI)

5 个答案:

答案 0 :(得分:2)

通常的做法是尽可能少地添加逻辑。 大多数时候,构造函数用于注入依赖项。

constructor(private anotherService: AnotherService) {
    // **don't** do Things with anotherService
  }

然后将其用于其他功能

ngOnInit() {
   this.anotherService.getValue().subscribe((value) => {
      // do something
   });
}

在创建组件的DOM,注入所有依赖项并绑定所有输入时,将调用ngOnInit()函数。即使逻辑不依赖DOM,输入绑定或Dependencie注入,也通常使用ngOnInit()。

答案 1 :(得分:1)

考虑这些:

  1. 当遇到在开发人员Remove-AzADApplication中有效但在AOT中无效的问题时,请打开$connection = Get-AzAutomationConnection -ResourceGroupName <ResourceGroupName> -AutomationAccountName <AutomationAccountName> -Name AzureRunAsConnection $appid = $connection.FieldDefinitionValues.ApplicationId Remove-AzADApplication -ApplicationId $appid Remove-AzAutomationAccount -ResourceGroupName <ResourceGroupName> -Name <AutomationAccountName> 以获取有关问题的详细信息。
  2. 例如,AOT不能与箭头功能一起使用。
  3. ng serve用于optional dependencies

答案 2 :(得分:1)

您可以使用可选的注入令牌

token.ts

import {InjectionToken} from '@angular/core';

export const INTEGER_TOKEN= new InjectionToken<number>('IntegerToken');

app.module.ts

import {INTEGER_TOKEN} from './token';

@NgModule({
//...
  ],
  providers: [
    {
      provide: INTEGER_TOKEN,
      useValue: 1 //Or factory if you need one
    },

service.ts

import {INTEGER_TOKEN} from './token';

import {Injectable, Inject, Optional} from '@angular/core';


@Injectable({
  providedIn: 'root',

})
export class MyService{

  constructor(@Optional() @Inject(INTEGER_TOKEN) private someInteger?: number) {
    // doThings with someInteger
  }

答案 3 :(得分:0)

只需删除'?'

import {MyAnotherService} from '/pathto your service';
     constructor(private anotherService: MyAnotherService) {
           //prodedures
          }

或用于参数:

myVariable: any;
constructor(private anotherService: MyAnotherService) {

this.myVariable = [];
}

答案 4 :(得分:0)

构造函数通常应仅用于依赖注入

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

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