当前位置:  开发笔记 > 编程语言 > 正文

如何在bootstrapping angular 2应用程序时调用rest api

如何解决《如何在bootstrappingangular2应用程序时调用restapi》经验,为你挑选了2个好方法。

当angular 2 app被引导时,我们想调用一个rest api,我的意思是应该对应用程序做的第一件事就是调用这个api并获取应用程序所需的一些数据.

反正有没有实现这个目标?我看到了以下文章,但它是用于Angular 2的beta版本

基于Angular 2 beta或rc的示例代码

在应用启动之前读取数据



1> Santanu Bisw..:

您可以使用APP_INITIALIZER在引导程序中调用服务方法.你需要provider在你的中定义一个for AppModule.

以下是如何执行此操作的示例.

StartupService(startup.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 {

        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.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 { }

编辑(如何处理启动服务失败):

AppComponent(app.component.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 });
        }
    }

}


感谢提供的示例,只是想指出`private startup:ConfigService`可能应该是`private startup:StartupService`

2> 小智..:

我使用Santanu提供的答案遇到的一件事是它不会工作,除非StartupService在提供者之前定义APP_INITIALIZER.使用Angular 4.x,所以提供者部分在我的情况下看起来像这样:

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

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有