【问题标题】:How to properly bootstrap an angular application如何正确引导 Angular 应用程序
【发布时间】:2019-11-08 04:49:16
【问题描述】:

我一直在考虑“引导”角度 (v6) 应用程序的最佳方法。通过引导,我的意思是从服务器上的静态 json 文件中获取我的应用程序可能需要的初始配置,并可能在触发组件创建级联等之前对所需的各种数据发出 1 或 2 个其他 http 请求。

目前我们的方法是在 AppComponent 中做所有事情,并将所有内容包装在应用组件的模板中,例如

<div *ngIf="isBootstrapping">...show a spinner here...</div>
<div *ngIf="!isBootstrapping">...put main site contents here...</div>

然后,当各种请求完成并且我拥有我认为必要的所有数据时,只需在应用程序组件中切换 isBootstrapping。不过,这对我来说感觉像是一种肮脏的方法,我认为 Angular 有一些更优雅的东西。

我是否应该在具有 useFactory 选项的提供程序中执行此操作?

【问题讨论】:

  • 如果我了解您的需求,您可以通过APP_INITIALIZER 执行此操作,您可以挂钩到角度引导过程。

标签: angular


【解决方案1】:

Angular 确实有一些更优雅的东西。这是APP_INITIALIZER 令牌。它看起来像:

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


function initApp(http: HttpClient) {
  return () => {
    return http.get('https://link.to/configuration.json')
      .pipe(
          // do your configuration stuff
      )
      .toPromise();
  };
}

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: initApp,
      multi: true,
      deps: [HttpClient]
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

它将运行initApp 逻辑并等待它完成,然后再提升AppComponent

【讨论】:

  • 这似乎好多了,谢谢。但这不意味着在我的引导请求完成之前浏览器会显示一个空白页面吗?而在应用程序组件中执行此操作可以让我显示一个微调器?
  • 它将显示您在index.html 中的app-root 标记(您的AppComponent 的选择器)中的任何内容。你可以在那里添加一个微调器。当初始化完成并继续加载应用程序时,它将被替换。
猜你喜欢
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2017-12-28
  • 2021-09-05
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多