【问题标题】:Angular 2-4 - Make Http web API call and get access to result in different componentsAngular 2-4 - 进行 Http Web API 调用并获得对不同组件的访问权限
【发布时间】:2026-02-07 11:20:03
【问题描述】:

我想在我的应用启动后立即进行 Web API 调用。这个 Http 调用应该返回一个 Json 对象数组。

我想根据返回的元素数量创建 HTML 元素(在我的根应用程序中),然后在不同的 (child->child->child) 组件中访问和显示该数据,而不会将其分解为来自根应用程序。

我想我必须创建一个service 类。

问题

  1. 服务是在应用启动后立即实例化,还是仅在创建使用该服务的第一个组件时实例化?
  2. 我可以使用 Promise 来实现我想要的行为,还是必须使用 observable (BehaviorSubject)?
  3. 根据 2. 是否可以启动 Web API 调用(一旦应用启动),然后从其他独立组件检查数据是否已存在于我的服务中并使用它?

【问题讨论】:

  • 我个人使用ngOnInit() { this.getNames() } 返回用户列表,然后<ul><li>*ngFor="let name of names"</li></ul> 为返回的每个名称动态创建列表元素。我不确定这是否对您直接有用,但也许会。
  • 这种方法的问题是,我在li 元素中嵌套了组件(你给出的例子),我不想像name 这样的数据一直通过我的容器和其他组件,直到我到达我需要它的组件
  • 检查this answer

标签: angular reactivex


【解决方案1】:

您可以使用 APP_INITIALIZER 在启动时调用 HTTP 方法,如this 问题中所述。

如果你走这条路——如果你使用 Promise,应用程序在 JSON 被下载之前不会加载,如果你使用 observable,它将在启动时开始下载并继续渲染其他所有内容。

如果您将返回的值存储在服务的某个字段中,您可以从任何地方访问它们。

一些代码: app.module.ts

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { Http, HttpModule, JsonpModule } from '@angular/http';
import { UserService } from '../services/user.service';

<...>
@NgModule({
  imports: [
    BrowserModule,
    HttpModule,
    FormsModule,
    JsonpModule,
    routing
  ],
  declarations: [
    AppComponent,
    <...>
  ],
  providers: [
    <...>
    UserService,
    {provide: APP_INITIALIZER,
      useFactory: (userServ: UserService) => () => userServ.getUser(),
      deps: [UserService, Http],
      multi: true
    }
  ],
  bootstrap: [AppComponent]

user.service.ts

@Injectable()
export class UserService {

    public user: User;
    constructor(private http: Http) { }

    getUser(): Promise<User> {
        console.log('get user called');
        var promise = this.http.get('/auth/getuser', { headers: getHeaders() })
            .map(extractData)
            .toPromise();
        promise.then(user => {
            this.user = user;
            console.log(this.user);
        });
        return promise;
    }
}

【讨论】:

  • 1.我读到APP_INITIALIZER 仍处于试验阶段,它用于我们客户的应用程序中。 2. 我如何知道服务中的字段何时有我想要的来自网络调用的数据?因为应用程序的渲染速度肯定会比网络调用返回我的数据更快。
  • 1.它不再是实验性的angular.io/api/core/APP_INITIALIZER 2. 在模板中尝试一个简单的 ngIf,或者如果它不起作用,或者如果您不想从服务直接输出到模板,请进行可观察并广播数据已加载,就像这里 @987654323 @