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…
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.
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.
This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.