Angular MatDialog alatt service betöltése/átadása

Kicsit elakadtam Angulárban service betöltéssel kapcsolatban. Készítettem egy service-t, amelynek csak két útvonalon van értelme, így nem szeretném root serviceként “betölteni”. Ugyanakkor, ha az egyik ilyen útvonalon matdialog ablakot szeretnék megjeleníteni, ahol szeretném használni ezt a service-t, akkor “No provider for Service!” hibaüzenetet kapok.
Hogyan lehet “betölteni” a service-t úgy, hogy ne készítsen új példányt belőle a rendszer és használja azt, ami a meghívó komponensben létrejött?
Az egyetlen egy megoldás amit találtam az az, hogy átadom MatDialogConfig segítségével a serivce-t magát. De “szabad” ilyet tenni, van esetleg hátulütője (pl. memory leaking …), esetleg van más megoldás?
Egyébként az adott service-ben vannak letárolva értékek, amiket szeretnék használni. Ezen felül ezen értékek átírásakor lefutnak kódok (amit nyilván nem szeretnék két külön helyen megírni) + feliratkozhatnak ilyen értékek változására más komponensek is (amik a háttérben működnek, míg a dialog felugrik). Van valakinek javaslata mi lehet a jó megoldás?

Köszi, de valahogy én nem találtam meg ebben amit kerestem. Mert igaz, hogy singletonra vágyom, de nem szeretném rootként létrehozni csak annál a path-nál, ahol használni is kell.
Azt elfelejtettem írni, hogy az alkalmazásom már full standalone, ez fontos infó lehet.
Végignyálaztam a Dependency Injection (DI) átfogó leírását, a services and DI bevezetését, valamint még a DI in action részt is, de egyik helyen sem találtam infót arról, amit szeretnék. Persze nem mondom azt, hogy nincs rá megoldás, csak nem találom… :slight_smile:

Egyébként a probléma az, hogy az adott component (ahol providers szekcióban meg van határozva a service) html temlatejében nem szerepel a matdialog component html tagjei, emiatt a matdialog compoonent már nem találja az adott service-t. Ha a providers-ben megadnám a matdialog componentben is, az már a service egy másik példánya lenne, amit nem szeretnék.

Kipróbáltam, hogy mégiscsak rootként határoznám meg a service-t. Reméltem, hogy nem fogja betölteni a rendszer előre csak akkor, ha használja is valamelyik komponens. Sajnos nem nyert, ha @Injectable({ providedIn: 'root' }) módon határozom meg a service-t, akkor mindenképpen betölti az alkalmazás indulásakor. :frowning:

Megvan a megoldás, pofonegyszerű: Mint említettem bizonyos path esetén van csak szükségem az adott service-re. Egyszerűen a Routes megharározásnál az adott path providers szekcióban kell szerepeltetni az adott service-t:


export const routes: Routes = [
	{ path: "", redirectTo: "/index", pathMatch: "full" },
	{ path: "index", loadComponent: () => import("./components/index.component").then(m => m.IndexComponent) },
	{ path: "example", canActivate: [AuthGuard], loadComponent: () => import("./components/example.component").then(m => m.ExampleComponent), providers: [ ExampleService ] }
]

Egyébként próbálkoztam InjectionToken-nel is, de az is sikertelen volt. Ugyanis a “root” vagy “platform” típusúval működött volna, de nyilván minden útvonalon betöltötte volna. Az “any” pedig már nem singleton, azaz a matdialog component esetben egy újat készített a rendszer, ami meg már egy másik service példány volt, ami megint nem volt jó megoldás.

1 Like

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.