因此,在避免使用Angular 动画之后,我想最终try 使用它.从理论上讲,我非常喜欢这个.但似乎有一些奇怪的行为在我看来是没有道理的.

    animations: [
        trigger('enterAnimation', [
          transition(':enter', [
            query(':self, td', [
              style({ transform: 'translateX(100%)', opacity: 0 }),
              stagger(100, [
                animate(
                  '500ms',
                  style({
                    transform: 'translateX(0)',
                    opacity: 1,
                    'overflow-x': 'hidden',
                  })
                ),
              ]),
            ]),
          ]),
        ]),
    trigger('rowAnimations', [ //NOTE: I need to include this, otherwise manually added items do not work
      transition(':enter', [
        style({ transform: 'translateX(100%)', opacity: 0 }),
        query(':self', [
          animate(
            '500ms',
            style({
              transform: 'translateX(0)',
              opacity: 1,
              'overflow-x': 'hidden',
            })
          ),
        ]),
      ]),
      transition(':leave', [
        query(':self', [
          style({
            transform: 'translateX(0)',
            opacity: 1,
            overflow: 'hidden',
            width: '100%',
            height: '*',
          }),
          animate('500ms', style({ transform: 'translateX(50%)', opacity: 0 })),
        ]),
      ]),
    ]),
  ],

触发器动画enterAnimation对于预加载的数据工作得非常好.动画是交错的,一切都与第一负荷的项目.然而,如果没有触发器rowAnimations,我添加的:enter过渡和随后添加的项目不会被呈现.我还加上了突袭.

https://stackblitz.com/edit/angular-animation-with-table-row-8qvh2f?file=src%2Fapp%2Fapp.component.ts

编辑:解决方案:

<table [@tableAnimations]="items.length" id="customers">
  <tr>
    <th>Name</th>
    <th>Country</th>
  </tr>
  <ng-container *ngFor="let o of items; let i = index">
    <tr class="data" [@rowAnimations]>
      <td>{{ o.Name }}</td>
      <td>{{ o.Country }}</td>
    </tr>
  </ng-container>
</table>

正如Andrei在解决方案中建议的那样,我们希望添加一个超过:enter Select 器的触发器.因此,绑定到数组长度会更简单.就其本身而言,它并没有起到多大作用.同样,如所建议的,这是通过转换规则* <=> *来解决的,这意味着绑定到触发器的任何值都将触发动画.

      transition('* <=> *', [
        query('@rowAnimations', [stagger(100, [animateChild()])]),
      ]),

如果没有过渡规则,行动画不会以交错方式触发,而是全部并行触发.回想起来,这是有道理的.

推荐答案

trigger绑定应更改为触发trigger.例如 [@enterAnimation]="items.length"transition('* <=> *'.在您的情况下,当它进入时-如预期的那样,它只执行一次.

第二:你其实并不需要query(':self')美元.它可以省略

第三,你可以在更高的层次上控制动画,并在元素层次上描述元素的动画

trigger('enterAnimation', [
      transition(':enter', [
        query('@rowAnimations', [
          stagger(100, [
            animateChild()
          ])
        ])
      ])
....
trigger('rowAnimations', [
      transition(':enter', [
        style({ transform: 'translateX(100%)', opacity: 0 }),
          animate(
            '500ms',
            style({
              transform: 'translateX(0)',
              opacity: 1,
              'overflow-x': 'hidden',
            })
          ),
      ]),

这样,动画将在父级交错-&>:Enter,然后每个元素都进入,只有子级动画被触发

Angular相关问答推荐

Angular独立组件(使用LoadComponents)-懒惰加载服务不工作

tabindex on button on button in MatMenu in angular不工作

添加@ nx/webpack插件 destruct 了Nativescript构建

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

带有服务依赖的Angular测试类

我如何更新此Ionic应用程序以解决路由问题?

从、管道和映射可观察到的逻辑?

ANGLING:ExpressionChangedAfterChecked在嵌套形式中由子项添加验证器

如何让 ag-Grid 事件读取私有方法?

Angular 9表单构建器 - 日期验证器问题

URL 更改但组件未在 Angular 导航中呈现

VSCode 调试器空白页面并在使用 VS Code 1.76.1 和 Chrome 111 启动时加载

应该显示在表格中的嵌套循环

显示 1 个数据而不是所有 ngFor - Angular 11

绑定 Angular material Select 列表

Angular2 Pipes:输出原始 HTML

Angular 6 - NullInjectorError:单元测试中没有 HttpClient 的提供者

为什么Angular 12 'ng serve' 构建应用程序的速度很慢?

将外部 CSS 加载到组件中

具有多个订阅者的 Angular 2 Observable