0

我有一种情况,我希望能够在页面上同时使用多个小部件组件。我想隔离 ContainerComponent 依赖项,以便每个 ContainerComponent 实例引用唯一的服务实例。

例如,我希望以下组件的每个实例都有一个唯一的“FhirService”实例:

export class ContainerComponent implements OnInit, OnDestroy, AfterViewInit {
...
constructor(private _fhir: FhirService, private _questionnaireService: QuestionnaireService, private cdr: ChangeDetectorRef) {}

服务定义:

@Injectable({
  providedIn: 'root'
})
export class FhirService {
  public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

  constructor(private _http: HttpClient, private _settingsService: SettingsService) {
    this.guidanceResponseBS = new BehaviorSubject<GuidanceResponse>(null);
  }

...

这是怎么做到的?

4

2 回答 2

1

如果要为不同的组件提供唯一的服务实例,则必须在组件的 @Component() 装饰器中添加服务。您应该将这些服务添加到提供者数组中以进行子模块声明或组件声明:

通过在以下三个位置之一设置元数据值,您可以在应用程序的不同级别为提供程序配置注入器:

在服务本身的 @Injectable() 装饰器中。

在 NgModule 的 @NgModule() 装饰器中。

在组件的 @Component() 装饰器中。

前任:

 @Component({
  selector: 'app-hero-list',
  template: `
    <div *ngFor="let hero of heroes">
      {{hero.id}} - {{hero.name}}
    </div>
  `,
 providers: [myService]
})
于 2018-12-04T20:34:05.830 回答
0

首先,您不需要有多个 Angular 服务实例。它是一个 DI 框架,因此您应该(在大多数情况下)拥有每个服务的单个实例。

可能导致您认为您最终需要为每个类提供特定/单独的服务实例的事情是使用以下语句:

public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;

您将数据(状态)的概念与business logic. 您的服务不应该包含/保存数据,至少不是您想要business logic的。

现在,也有一些服务会包含数据,但这通常是为了在应用程序中的更多组件之间共享数据。通常,在这些情况下,您会在同一阶段加载数据并将其保存在服务中以供将来使用。

于 2018-12-04T20:32:09.930 回答