網站搜尋

javascript - Angular:如何注入抽象服務的多個實例


我對 Angular 還有點陌生,正在嘗試理解一位資深開發者寫的程式碼。如果我沒有遵循標準的交流方式和用詞,請見諒。

我有一個抽象類別 abstractDatService,其中包含一個抽象方法 getEntities(),其實現類別為 impl1 和 impl2

實作類別看起來像:

@Injectable()
export class impl1 extends abstractDatService{
  
  private entities: Modal[] = [
    {
      id: 1,
      type: "a",
      name: "a1"
    },
    {
      id: 2,
      type: "a",
      name: "a2"
    }
  ];

  public getEntities(): Observable<Modal[]> {
    return of(this.entities);
  }
}

現在,在我的模塊中,我正在嘗試以以下方式注入服務:

  providers: [
    {
      provide: abstractDatService,
      useClass: impl1
    },
    {
      provide: abstractDatService,
      useClass: impl2
    }
  ]

在這種情況下,當我嘗試獲取實體時,它們只返回 impl2 類的實體,而不是 impl1 的實體

我希望實現可以返回兩者。

有人可以幫我弄明白這個嗎?

編輯:

詳細說明

我有一個元件,我正在以一種方式顯示資料

HEAD1
Data from impl1 // this line is a common component in which there is a ngFor on observable returned.

HEAD2
Data from impl2 // this line is a common component in which there is a ngFor on observable returned.

共同的組件是顯示來自 impl1 的數據和來自 impl2 的數據的組件

答案#1

根據評論

請詳細說明。你說你想要兩者,這是什麼意思?你的意思是你希望注入的服務是兩者的結合,這樣 getEntities 就會返回兩者的元素嗎?

是的,我想以一種方式注入,使我能獲得 impl1 和 impl2 兩個模型的數據

你需要改變兩件事。

第一:您的提供者定義需包含 multi: true

providers: [
    {
      provide: AbstractionService,
      useClass: Impl1Service,
      multi: true,
    },
    {
      provide: AbstractionService,
      useClass: Impl2Service,
      multi: true,
    }
  ]

第二:使用陣列處理多重注入

 constructor(@Inject(AbstractionService) impls: AbstractionService[]) {
    const obs$ = impls.map(impl => impl.getEntities());

    combineLatest(obs$).subscribe(console.log);
  }

在 stackblitz 上檢查相同內容:https://stackblitz.com/edit/angular-ivy-pwysue?file=src/app/app.module.ts