我遇到一种情况,希望同时在页面上使用多个窗口小部件组件。我想隔离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);
}
...
这是怎么做的?
答案 0 :(得分:1)
如果要为不同的组件提供唯一的服务实例,则必须在组件的@Component()装饰器中添加服务。您应将这些服务添加到子组件的provider数组中模块声明或组件声明:
您可以在不同级别的提供商处配置注射器 应用程序,方法是在以下三个位置之一中设置元数据值:
在服务本身的@Injectable()装饰器中。
在NgModule的@NgModule()装饰器中。
在组件的@Component()装饰器中。
EX:
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`,
providers: [myService]
})
答案 1 :(得分:0)
首先,您不需要在角度中拥有多个服务实例。这是一个DI框架,因此(在大多数情况下)您应该为每个服务拥有一个实例。
可能导致您认为最终需要为每个类提供服务的特定/单独实例的事情是:
public guidanceResponseBS: BehaviorSubject<GuidanceResponse>;
您正在将 data (状态)的概念与business logic
的概念相结合。您的服务不应该包含/保存数据,至少不应该包含business logic
这样的数据。
现在,还有一些服务将包含数据,但是通常这样做是为了在应用程序的更多组件之间共享数据。通常,在这种情况下,您需要在同一阶段加载数据,然后将其保存在服务中以供将来使用。