50 votes

Comment appeler une api de repos lors du démarrage d'une application angular 2

Nous aimerions appeler une api rest quand angulaire 2 application en cours de bootstrap, je veux dire la première chose qu'il doit faire à propos de l'application est d'appeler cette api et d'obtenir certaines données qui est nécessaire pour l'application.

Est-il de toute façon pour y parvenir? J'ai vu la suite de l'article, mais il a été conçu pour la bêta vewrsion Angulaire 2

Exemple de Code basé sur Angulaire 2 beta ou rc

La lecture des données avant application de démarrage

108voto

Santanu Biswas Points 3066

Vous pouvez utiliser APP_INITIALIZER pour appeler un service méthode de bootstrap. Vous aurez besoin de définir un provider dans votre AppModule.

Voici un exemple de comment faire cela.

StartupService (démarrage.service.ts)

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class StartupService {

    private _startupData: any;

    constructor(private http: Http) { }

    // This is the method you want to call at bootstrap
    // Important: It should return a Promise
    load(): Promise<any> {

        this._startupData = null;

        return this.http
            .get('REST_API_URL')
            .map((res: Response) => res.json())
            .toPromise()
            .then((data: any) => this._startupData = data)
            .catch((err: any) => Promise.resolve());
    }

    get startupData(): any {
        return this._startupData;
    }
}

AppModule (app.le module.ts)

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, APP_INITIALIZER } from '@angular/core';

import { StartupService } from './startup.service';

// ...
// Other imports that you may require
// ...


export function startupServiceFactory(startupService: StartupService): Function {
    return () => startupService.load();
}

@NgModule({
    declarations: [
        AppComponent,
        // ...
        // Other components & directives
    ],
    imports: [
        BrowserModule,
        // ..
        // Other modules
    ],
    providers: [
        StartupService,
        {
            // Provider for APP_INITIALIZER
            provide: APP_INITIALIZER,
            useFactory: startupServiceFactory,
            deps: [StartupService],
            multi: true
        }
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

EDIT (Comment gérer l'échec de démarrage du service):

AppComponent (app.composante.ts)

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

import { StartupService } from './startup.service';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

    constructor(private router: Router, private startup: StartupService ) { }

    ngOnInit() {

        // If there is no startup data received (maybe an error!)
        // navigate to error route
        if (!this.startup.startupData) {
            this.router.navigate(['error'], { replaceUrl: true });
        }
    }

}

13voto

Dusan Mancic Points 116

La réponse fournie par Santanu a révélé que cela ne fonctionnerait que si StartupService est défini dans les fournisseurs avant les APP_INITIALIZER . Utiliser Angular 4.x , donc la partie fournisseurs ressemble à ceci dans mon cas:

   providers: [
    UserService,
  {
    provide: APP_INITIALIZER,
    useFactory: userServiceFactory,
    deps: [UserService],
    multi: true
  }
 

-2voto

Ganesh Rajan Points 55

Voici un article qui explique APP_INITIALIZER de manière beaucoup plus détaillée et qui montre également comment angular l’utilise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X