【问题标题】:Angular 7 animation trigger causes console errorAngular 7 动画触发器导致控制台错误
【发布时间】:2019-10-23 19:41:00
【问题描述】:

我正在尝试在组件上设置一个 fadeInOut 动画。 我的应用模块导入 BrowserAnimationsModule。

我在单独的文件中创建了一个动画和一个触发器:

import { animate, style, animation, trigger, useAnimation, transition } from '@angular/animations';

export const fadeIn = animation([style({ opacity: 0 }), animate('500ms', style({ opacity: 1 }))]);
export const fadeOut = animation(animate('500ms', style({ opacity: 0 })));

export const fadeInOut = trigger('fadeInOut', [
  transition('void => *', useAnimation(fadeIn)),
  transition('* => void', useAnimation(fadeOut))
]);

然后,我创建了一个组件并验证了该组件本身是否有效:

import { Component, OnInit } from '@angular/core';
import { Globals } from '@app/globals';
import { fadeInOut } from '@app/animations';

@Component({
  selector: 'app-global-alert',
  template: `
    <div class="global-alert" *ngIf="globalAlert">
      <div class="global-alert-message"><ng-content></ng-content></div>
      <div class="close" (click)="closeGlobalAlert()"></div>
    </div>
  `,
  styles: [],
  animations: [fadeInOut]
})
export class GlobalAlertComponent implements OnInit {
  private globalAlert: boolean;

  constructor(private globals: Globals) {
    this.globalAlert = globals.hasGlobalAlert;
  }

  ngOnInit() {}

  closeGlobalAlert() {
    this.globals.hasGlobalAlert = false;
    this.globalAlert = false;
  }
}

请注意,我正在存储此警报是否应出现在 globals.ts 文件中的状态,尽管这无关:

import { Injectable } from '@angular/core';

@Injectable()
export class Globals {
  hasGlobalAlert = true;
}

所以我在另一个组件的 html 中使用该组件,如下所示:

<div>
lots of html
</div>
   <app-global-alert>Hello world</app-global-alert>

这可行,当您单击关闭按钮时,警报会消失,一切都按预期工作。但是,当我尝试将触发器添加到它时

   <app-global-alert [@fadeInOut]>Hello world</app-global-alert>

我收到控制台错误 Error: Found the synthetic property @fadeInOut. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.

我已经用谷歌搜索过这个,但我已经在大多数回复中涵盖了所有问题:我在组件中包含了 animations 声明,等等。

我错过了什么?

【问题讨论】:

    标签: javascript angular animation angular-animations


    【解决方案1】:

    正如官方docs 所说,动画应该添加到组件的元数据属性中。 GlobalAlertComponent这里有这样的属性:

    @Component({
      animations: [fadeInOut],
      ...
    })
    export class GlobalAlertComponent implements OnInit {
    ...
    

    这允许在该组件的html 部分内的任何元素上使用动画。但是@fadeInOut动画已经用在另一个组件的html这里了:

    <div>
      lots of html
    </div>
      <app-global-alert [@fadeInOut]>Hello world</app-global-alert>
    

    确保该组件在其元数据中具有导入和动画属性。

    【讨论】:

    • 这修复了错误,虽然实际的动画还没有工作。我认为这是因为我的 ngIf 在组件的模板内,而不是在组件本身上。
    • 是的,就是这样。我将所有内容都移到了全局警报组件中,包括触发器。现在工作。谢谢@vadi
    【解决方案2】:

    您需要添加BrowserAnimationsModule 在 import 部分的 app-module.ts 文件中。

    import: [
    BrowserAnimationsModule
    ]
    

    希望它会有所帮助。 快乐编码:)

    【讨论】:

      【解决方案3】:

      我收到控制台错误错误:Found the synthetic property @fadeInOut. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.

      当您没有在包含 Module 的组件中导入 "BrowserAnimationsModule" or "NoopAnimationsModule" 模块时会发生此错误。如果您的动画组件在 App 模块中,则检查 app.module 是否在 @NgModule 中具有以下内容 -

      @NgModule({  
        imports: [
          BrowserModule,
          BrowserAnimationsModule //or NoopAnimationsModule
        ],
        providers: [],
        bootstrap: [AppComponent]
      })
      export class AppModule { }
      

      【讨论】:

      • 只是想确认您的 GlobalAlertComponent 是否是 AppModule 的一部分,而不是另一个功能模块?如果它是功能模块的一部分,则相应的功能模块必须导入 BrowserAnimationsModule。
      • GlobalAlertComponentSharedModule 的一部分。如果我尝试将BrowserAnimationsModule 导入SharedModule,我会得到一个不同的错误Error: Uncaught (in promise): Error: BrowserModule has already been loaded.。如果我尝试从 AppModule 中删除它,我仍然会收到错误消息。
      • 请尝试在共享模块中重新导出 BroswerAnimationModule,即导出:BrowserAnimationModule 并从 App 模块中删除引用。
      • 查看接受的答案:事实证明与模块无关。我认为 Angular 应该在这里抛出一个更有帮助的错误。
      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      相关资源
      最近更新 更多