2017-12-28 6 views
-2

Ich versuche, einige $_SESSION Variablen von PHP bis Angular zu bekommen. Ich erstellte eine Injectable Klasse mit der Bezeichnung Globals und definierte diese Klasse in Providers von AppModule.Angular 4 Dependency Injection mit Ajax Call

Hier ist mein globals.ts:

import { Injectable } from '@angular/core'; 

@Injectable() 
export class Globals { 
    errorMessage: string; 

    activeUser: any; 

    test: string = "test string"; 

    constructor(private userService: UserService) { 
     this.getActiveUser(); 

     console.log(this.activeUser); //undefined 
    } 

    getActiveUser(){ 
     this.userService.getActiveUser() 
      .then(
       user => this.activeUser = user, 
       error => this.errorMessage = <any>error 
      ); 
    } 
} 

Der obige Protokollierung Befehl funktioniert nach dem Laden des gesamte Projekt abgeschlossen ist. Aber es ist eine Abhängigkeit für mich und ich bekomme den zurückgegebenen Wert in meinem Konstruktor.

Eine beispielhafte Komponente ist unten:

import { Component } from '@angular/core'; 

import { Globals }     from "../globals"; 

@Component() 
export class ExampleComponent implements OnInit, AfterViewInit { 
    constructor(
     private globals: Globals 
    ) { 
     console.log(this.globals.activeUser); //undefined 

     console.log(this.globals.test); //"test string" 
    } 
} 

ich auch eine Plunker dafür geschaffen: https://embed.plnkr.co/zRmkQdfqYDBTAoQPqJ5V/

EDIT: Ich weiß, dass es durch Asynchronität verursacht wird, was ich brauche, ist eine Lösung für erhalten activeUser vor der Initialisierung

Jede Hilfe wird geschätzt.

+0

lesen auf Asynchronität up :) – Alex

+0

Ich weiß, was Asynchronität ist und ich weiß auch, dass dieses Problem dadurch verursacht wird. Was ich brauche, ist keine Lektion darüber, sondern eine Lösung. – yenerunver

+0

Sie sollten sorgfältig lesen @ AJT_82 "Der obige Protokollierungsbefehl funktioniert, nachdem das Laden des gesamten Projekts abgeschlossen ist. Aber es ist eine Abhängigkeit für mich und ich habe den zurückgegebenen Wert in meinem Konstruktor." – yenerunver

Antwort

0

Als AJT_82 über Kommentare vorgeschlagen, wird das Problem durch APP_INITIALIZER gelöst.

Zuerst habe ich APP_INITIALIZER auf meinem app.module.ts importiert:

import { NgModule, APP_INITIALIZER } from '@angular/core'; 

Vor @NgModule() Funktion, ich habe diese enthalten:

export function init_app(globals: Globals) { return() => globals.InitializeApp(); }

Auch im providers Abschnitt :

providers:[ 
    Globals, 
    { provide: APP_INITIALIZER, useFactory: init_app, deps: [Globals], multi: true }, 
] 

Schließlich mein globals.ts:

getActiveUser(resolver){ 
    this.userService.getActiveUser() 
     .then(
      user => { 
       this.activeUser = user; 

       resolver(); 
      }, 
      error => this.errorMessage = <any>error 
     ); 
} 

InitializeApp(): Promise<any> { 
    return new Promise((resolve, reject) => { 
     this.getActiveUser(resolve); 
    }); 
}