typescript - Angular 14 frittstående komponent for å bruke singleton-tjenesteinstans
Å bruke APP_INITIALIZER-tokenet i min app.module.ts for å kjøre initialiseringslogikk i en av tjenestene mine fungerer helt fint, helt til jeg prøver å bruke den samme tjenesten i en av mine frittstående komponenter, hvor jeg får en ny instans av den samme tjenesten, men uten initialiseringen.
app.modul.ts
@NgModule({
imports: [],
declarations: [],
providers: [
{
provide: APP_INITIALIZER,
useFactory: (fooService: FooService) => () => fooService.init(),
deps: [FooService],
multi: true,
},
],
bootstrap: [AppComponent],
})
export class AppModule {}
komponent.ts
@Component({
standalone: true,
imports: [],
providers: [FooService],
})
export class BarComponent implements OnInit, OnDestroy {
constructor(
private fooService: FooService
) {}
}
Når component.ts blir opprettet, får jeg en helt ny instans av fooService og jeg har ingen måte å kjøre async init()-metoden på før det skjer.
Svar #1
Når du markerer en tjeneste som en leverandør, vil en forekomst av den bli opprettet. I ditt tilfelle vil den enkleste tilnærmingen være å merke tjenesten som programomfattende ved å bruke {provideIn: 'root'}. For eksempel;
Fra dokumentene Singleton-tjenester
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
Men ovenfor er for NgModule-baserte komponenter og apper ELLER for app-omfattende tjenester (loaders, auth, osv.). Dette er app-omfattende, noe som kanskje ikke er veldig nyttig hvis du har frittstående underfunksjoner. Hvis du ønsket å bruke en singleton på tvers av en frittstående komponent og komponentene brukt innenfor den; prøv nedenfor
Fra dokumenter På komponentnivå
@Component({
standalone: true,
selector: 'hero-list',
template: '...',
providers: [HeroService]
})
class HeroListComponent {}
I dette tilfellet, sørg for å ikke inkludere tjenesten i leverandørliste for barnekomponenter, og inkluder den kun i konstruktøren. På den måten vil den samme instansen av tjenesten bli gjenbrukt.
