我有一个关于Angular 17独立API配置中main.ts的bootstrap调用的问题.具体地说:是否应该将提供程序/导入添加到要导入到独立组件、指令和管道的 bootstrap 调用in addition to

Some context:

我将一个遗留的Angular应用程序迁移到新的独立API配置中. 我用的是官方的standalone migration guide. 此示意图包含四个迁移步骤,其中第三个步骤是:

运行ng g@Angel/core:独立并 Select "Bootstrap the project 使用独立API"

此步骤将提供程序/导入从根NgModule模块复制到main.ts中的新 bootstrap 调用中.我的现在看起来是这样的:

bootstrapApplication(AppComponent, {
    providers: [
        importProvidersFrom(AppRoutingModule, BrowserModule, ReactiveFormsModule, 
        MatToolbarModule, MatButtonModule, MatIconModule, FormsModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule),
        provideAnimations(),
        provideHttpClient(withInterceptorsFromDi())
    ]
}).catch(err => console.error(err));

例如,您可以看到,Angular material 导入已添加到bootstrap调用中的providersarray.它们还在需要它们的组件中单独导入,这在独立API设置中是必需的.

就这样.

  • 为什么它们也会在 bootstrap 调用中导入?

  • 我是否应该将将来使用的任何新导入也添加到 bootstrap 调用中?例如:如果将来我决定使用自动完成,我是否应该将MatAutocompleteModule添加到 bootstrap 调用以及组件中?

Update

根据下面的意见/答案,迁移示意图在bootstrapApplication方法中添加的内容超过了必要/需要的数量(以确保顺利迁移).

我建议将其重构为app.config.ts模式.

重构后,我的设置是:

main.ts

bootstrapApplication(AppComponent, appConfig)
    .catch((err) => console.error(err));

app.config.ts

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes),
    provideAnimations(),
    provideHttpClient()
  ]
};

其他导入项(见原帖子中的bootstrapApplication项)要么已过时,要么只应在组件一级导入.

更多信息:Getting started with standalone components

推荐答案

在我看来,你的目标应该是这样的.

bootstrapApplication(AppComponent, {
    providers: [
        provideRouter(myRoutes)
        importProvidersFrom(ReactiveFormsModule),
        provideAnimations(),
        provideHttpClient(withInterceptorsFromDi())
    ]
}).catch(err => console.error(err));
  • BrowserModulebootstrapApplication功能自动导入.

  • 应通过将路由传递到provideRouter来提供路由

  • 每个material 导入都应该在组件级别.每个独立组件应仅导入其需要的material 模块

  • 作为改进,您应该考虑将provideAnimations替换为provideAnimationsAsync,以延迟加载动画包

  • FormsModule仍然需要加载,所以在这里就可以了.

  • 如果你把拦截器换成InterceptorFn ,你可以用provideInterceptors代替withInterceptorsFromDi()

Angular相关问答推荐

如何在自定义验证器中获取所有表单控件(字段组动态创建)

如何在HTMLTITLE属性中使用Angular 显示特殊字符?

MAT表的内联文本编辑-未刷新编辑图标

如何在ANGLING v17中使用鞋带样式组件?

ANGLE v16独立组件不能与拦截器一起工作?

基于RxJS的Angular 服务数据缓存

使用 Angular 类构造函数来获取依赖项

从 applescript 调用Angular 前端以从列表中 Select 一个项目

ngrx 效果等到从初始值以外的其他状态收到响应

大型 Angular 12 应用程序 - 我如何管理 js 文件

Angular 升级后 RXJS SwitchMap 无法与解析器一起正常工作

无法使用@ngrx/component-store 在其他组件中获取状态更改值

Angular 13 Sass 模块无法在编译中正确导入文件

无法将项目从 Angular 13 更新到 14

Angular/RxJS 6:如何防止重复的 HTTP 请求?

Angular 没有可用于依赖类型的模块工厂:ContextElementDependency

如何在angular 5的组件中格式化日期

Angular 2从assets文件夹加载CSS背景图像

Angular2动态改变CSS属性

如何对 *ngFor 应用数量限制?