2016-12-28 5 views
0

Gibt es eine Möglichkeit für @Injectable s als Singletons laden Komponenten mit loadChildren (Lazy Loading Komponenten)?Angular2: Lazy laden Komponenten und Injektionen als Singletons

Wenn nicht, gibt es einen Weg, es zu bekommen?

Ich frage nach this post. Demnach ist es nicht möglich, @Injectable als Singletons auf Submodulen zu injizieren.

Ich versuche, eine @Injectable AppState als Singleton zu injizieren:

@Injectable() 
export class AppState { 
    public user: string; 

    constructor() { 

    } 
... 

ich es auf AppModule als provider festgelegt haben:

// Application wide providers 
const APP_PROVIDERS = [ 
    AppState 
]; 

@NgModule({ 
    bootstrap: [ App ], 
    declarations: [ 
    App, 
    ErrorComponent 
    ], 
    imports: [ // import Angular's modules 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    RouterModule.forRoot(ROUTES, { useHash: true }) 
    ], 
    providers: [ 
    APP_PROVIDERS 
    ] 
}) 
export class AppModule { 
    constructor(public appRef: ApplicationRef, public appState: AppState) {} 
} 

So habe ich schuf auch eine "submodule":

@NgModule({ 
    //... 
    providers: [ AppState ] 
}) 
export default class LoginModule { 

Auf LoginComponent ich tun:

export class Login implements OnInit { 

    constructor(private appState: AppState) {} 

    public doLogin():void { 
     this.appState.user = this.form.value.mail; 
    } 
} 

Trotzdem auf einer anderen Komponente Profile genannt, es scheint, dass this.appState.user nicht definiert ist.

@NgModule({ 
    //... 
    providers: [ AppState ] 
}) 
export default class ProfileModule { /... } 

@Component({ 
    //... 
}) 
export class Profile implements OnInit { 

    constructor(private appState: AppState) { 

    } 

    ngOnInit():void { 
    this.user = this.appState.user; <<<<<<<<<<<<< it's undefined 
    } 
} 

Warum this.appState.user ist undifined wenn I'set es vor in einer anderen Komponente?

+0

Stellen Sie es nicht auf der Ebene Ihrer Lazy Load _modules_ bereit. Sie müssen es auf dem 'app.module_level (oder wenn Sie einen in Ihrem' core.module' verwenden) angeben. –

+0

Was ist mit [diesem Beitrag] (http://stackoverflow.com/a/40981772/217408)? – Jordi

Antwort

2

Dieser Beitrag erklärt alles, was Sie wissen müssen. Jeder Dienst, der im Lazy-Loaded-Modul deklariert wird, ist nur ein Singleton für dieses Modul. Jeder im Stammmodul geladene Dienst wird in der gesamten App ein Singleton sein, einschließlich innerhalb von Lazy-geladenen Modulen

+0

Ich habe den Beitrag bearbeitet. Demnach. Wenn ich 'AppState' in' AppModule (Konstruktor (private appState: AppState)) injiziere 'sollte es dasselbe Objekt (singleton) auf' LoginComponent' und 'ProfileComponent' sein, oder? Nichtsdestoweniger ist 'this.appState.user' immer' undefiniert', unabhängig davon, ob 'LoginComponent' es zugewiesen hat ... – Jordi

+0

@Jordi Warum deklarieren Sie 'AppState' im Provider-Array von' ProfileModule' und 'LoginModule'? Haben Sie versucht, es nur in 'AppModule' zu ​​deklarieren? – yurzui

+0

Ich dachte, dass es in jedem Modul als Provider deklariert werden musste ... – Jordi

1

Alle @Injectable() Dienste sind Singletons. Das Laden von Komponenten ist die Aufgabe des Routers, nicht der Service.

+0

Was ist mit [diesem Beitrag] (http://stackoverflow.com/a/40981772/217408)? – Jordi

Verwandte Themen