Как добавить BrowserAnimationsModule или NoopAnimationsModule в автономный компонент?
Проблема
Когда я добавляю a или a в массив импорта моего Standalone AppComponent, это ломает приложение.
@Component({
standalone: true,
imports: [
CommonModule,
NoopAnimationsModule,
/* ... */
],
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
Вот ошибки, которые я получаю, когда добавляю любой из них:
ERROR Error: Uncaught (in promise): Error: Providers from the `BrowserModule` have already been loaded.
If you need access to common directives such as NgIf and NgFor, import the `CommonModule` instead.
Error: Providers from the `BrowserModule` have already been loaded.
If you need access to common directives such as NgIf and NgFor, import the `CommonModule` instead.
И когда я не добавляю его, я получаю эту ошибку:
ERROR Error: Unexpected synthetic property @transitionMessages found. Please make sure that:
- Either `BrowserAnimationsModule` or `NoopAnimationsModule` are imported in your application.
- There is corresponding configuration for the animation named `@transitionMessages` defined in
the `animations` field of the `@Component` decorator (see
https://angular.io/api/core/Component#animations).
Мои выводы на данный момент...
по-видимому
BrowserAnimationsModule
а также
NoopAnimationsModule
содержать
BrowserModule
, и я предполагаю, что автономные компоненты тоже. Как я могу исключить
Browsermodule
либо из модуля анимации, либо из моего автономного компонента? Или есть какой-то другой анимационный модуль или решение, которое поможет мне с этой проблемой?
Вот Stackblitz , если вы хотите увидеть и попробовать сами.
3 ответа
Функция обеспечивает мост обратно в мир NgModule. Его не следует использовать в компоненте, поскольку его можно использовать только в инжекторе приложения.
Добавлять
importProvidersFrom
для предоставления BrowserAnimationModule внутри main.ts.
main.ts
bootstrapApplication(AppComponent,{
providers:[importProvidersFrom(BrowserAnimationsModule)]
});
Только что узнал, что importProvidersFrom следует использовать только один раз.
Неправильный:
bootstrapApplication(AppComponent,{
providers:[
importProvidersFrom(BrowserModule),
importProvidersFrom(BrowserAnimationsModule),
]
});
Правильный:
bootstrapApplication(AppComponent,{
providers:[
importProvidersFrom([BrowserModule, BrowserAnimationsModule])
]
});
Я столкнулся с той же проблемой. Я исправил это с помощью overrideComponent в моем
.overrideComponent(
CourseComponent,
// since you cannot simply ovveride services that have been injected into Angular Component's
// providers https://angular.io/guide/testing-components-scenarios#override-component-providers
{
set: {
providers: [
{ provide: CourseService, useValue: courseServiceMock },
],
imports: [
CommonModule,
ReactiveFormsModule,
// BrowserAnimationsModule, -- this cause error related to standalone components API therefore turned off
MatButtonModule,
MatInputModule,
MatIconModule,
MatDividerModule,
MatCardModule,
],
},
}
)