template index for example array angular transition angular-animations

index - ngfor angular 6 example



¿Cómo puedo animar*ngFor en angular 2? (2)

Necesito animar una lista ngFor medida que se rellena y se muestra. Cada elemento debe tener una transición, digamos algo como esto .

¿Cómo puedo hacer eso?


Tiene algunos problemas porque ngFor hace unos pocos añadidos / ngFor redundantes que hacen que los elementos sean animados que no deberían:

import {Component} from ''angular2/core''; import { Component, Directive, OnDestroy, Input } from ''angular2/core''; @Component({ selector: ''my-app'', template: `<div (click)="$event.preventDefault()"> <button type="button" (click)="pushItem()">Push</button> <button type="button" (click)="removeItemLast()">Remove Last</button><br/> <button type="button" (click)="unshiftItem()">Unshift</button> <button type="button" (click)="removeItemFirst()">Remove First</button><br/> <ul> <li class="my-animation" *ngFor="#item of items"> {{item.title}} </li> </ul> </div>` }) export class AppComponent { private count:number = 1; public items: Array<any>; constructor() { console.clear(); this.items = []; this.items.push(this.newItem()); this.items.push(this.newItem()); } pushItem() { this.items.push(this.newItem()); }, removeItemLast() { if(this.items.length > 0) this.items.splice(this.items.length - 1, 1); }, unshiftItem() { this.items.unshift(this.newItem()); }, removeItemFirst() { if(this.items.length > 0) this.items.splice(0, 1); }, newItem() { return {title: ''Item'' + this.count++}; } }

@keyframes MyAnimation { 0% { padding-left: 100px; } 100% { padding-left: 0px; } } .my-animation { animation: MyAnimation 1s; }

El ejemplo de Plunker (RC.x) de https://github.com/angular/angular/issues/7239 demuestra el problema.

Actualizar

Esto fue arreglado hace mucho tiempo

ejemplo de Plunker de trabajo (2.4.x)


Ahora está la guía del sistema de animación de Angular . Esto ayuda si queremos hacer cosas elegantes, como solo hacer la animación para los elementos añadidos después de que el componente se haya inicializado, no los que ya están presentes. He modificado la respuesta anterior para hacerlo de forma angular 2.

Plunker: http://plnkr.co/edit/NAs05FiAVTlUjDOZfEsF?p=preview

import { Component, trigger, transition, animate, style, state } from ''@angular/core''; @Component({ selector : ''my-app'', animations: [ trigger(''growShrinkStaticStart'', [ state(''in'', style({ height: ''*'', ''padding-top'': ''*'', ''padding-bottom'': ''*'', ''margin-top'': ''*'', ''margin-bottom'': ''*'' })), transition(''* => void'', [ style({ height: ''*'', ''padding-top'': ''*'', ''padding-bottom'': ''*'', ''margin-top'': ''*'', ''margin-bottom'': ''*'' }), animate("0.5s ease", style({ height: ''0'', ''padding-top'': ''0'', ''padding-bottom'': ''0'', ''margin-top'': ''0'', ''margin-bottom'': ''0'' })) ]), transition(''void => false'', [ /*no transition on first load*/ ]), transition(''void => *'', [ style({ height: ''0'', ''padding-top'': ''0'', ''padding-bottom'': ''0'', ''margin-top'': ''0'', ''margin-bottom'': ''0'' }), animate("0.5s ease", style({ height: ''*'', ''padding-top'': ''*'', ''padding-bottom'': ''*'', ''margin-top'': ''*'', ''margin-bottom'': ''*'' })) ]) ]) ], template : `<div (click)="$event.preventDefault()"> <button type="button" (click)="pushItem()">Push</button> <button type="button" (click)="removeItemLast()">Remove Last</button><br/> <button type="button" (click)="unshiftItem()">Unshift</button> <button type="button" (click)="removeItemFirst()">Remove First</button><br/> <ul style="background: light-blue"> <li *ngFor="let item of items" [@growShrinkStaticStart]="animationInitialized.toString()" (@growShrinkStaticStart.done)="animationInitialized = true" style="background-color:pink; border:1px dashed gray; overflow:hidden"> <h3>{{item.title}}</h3><p>{{item.description}}</p> </li> </ul> <div>Footer</div> </div>` }) export class AppComponent { private count: number = 1; public items: Array <{ title: string, description: string }> ; private animationInitialized: boolean = false; constructor() { this.items = []; this.items.push(this.newItem()); this.items.push(this.newItem()); } pushItem() { this.items.push(this.newItem()); } removeItemLast() { if (this.items.length > 0) this.items.splice(this.items.length - 1, 1); } unshiftItem() { this.items.unshift(this.newItem()); } removeItemFirst() { if (this.items.length > 0) this.items.splice(0, 1); } newItem() { let d: string = ""; let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz0123456789 . ! ? "; for (let i = 0; i < Math.floor(Math.random() * 50000); i++) d += possible.charAt(Math.floor(Math.random() * possible.length)); return { title : ''Item'' + this.count++, description: d }; } }