2016-06-28 6 views
18

Ich habe eine Komponente, die eine Liste von Elementen vom Server abruft und diese Liste dann mit * ngFor in der Vorlage anzeigt.Angular 2 animieren * ngFür Listenelemente nacheinander neue Animationsunterstützung in RC verwenden 5

Ich möchte die Liste mit einigen Animationen, aber nacheinander angezeigt werden. Ich meine, jeder Listeneintrag sollte nach dem anderen animieren.

ich so etwas wie dies versuche:

import { Component, Input, trigger, state, animate, transition, style } from '@angular/core'; 

@Component({ 
    selector: 'list-item', 
    template: ` <li @flyInOut="'in'">{{item}}</li>`, 
    animations: [ 
     trigger('flyInOut', [ 
      state('in', style({ transform: 'translateX(0)' })), 
      transition('void => *', [ 
       style({ transform: 'translateX(-100%)' }), 
       animate(100) 
      ]), 
      transition('* => void', [ 
       animate(100, style({ transform: 'translateX(100%)' })) 
      ]) 
     ]) 
    ] 
}) 
export class ListItemComponent { 
    @Input() item: any; 
} 

und in meiner Liste Komponentenvorlage Ich mag es bin mit:

<ul> 
    <li *ngFor="let item of list;"> 
    <list-item [item]="item"></list-item> 
    </li> 
</ul> 

Was sie tut, zeigt ganze Liste auf einmal ist. Ich möchte, dass Elemente nacheinander mit einer Animation eingegeben werden.

+1

Exakt gleiche Verhalten für mich erwartet! Hast du eine Lösung gefunden? –

+0

Noch nicht, aber es scheint, dass mit dem neuen Animationsmodul in Angular 2 es jetzt nicht viel schwieriger sein sollte. Wir können eine Komponente für das Listenelement erstellen und dann die Animation für "Eingeben" und "Verlassen" anhängen. Überprüfen Sie https://angular.io/docs/ts/latest/guide/animations.html –

+0

Ich habe gesehen, danke! Meine Lösung war, ein Timeout zwischen jedem Element für die Animation zu setzen, so dass alle LI-Elemente reibungslos mit einer Animation eingehen –

Antwort

12

ich nicht stagger Unterstützung auf ngFor in der Dokumentation finden konnte, aber gibt es jetzt animation.doneevents, die verwendet werden können staggering ngFor

[email protected]

@Component({ 
    selector: 'my-app', 
    template: ` 
    <ul> 
    <li *ngFor="let hero of staggeringHeroes; let i = index" 
     (@flyInOut.done)="doNext()" 
     [@flyInOut]="'in'" (click)="removeMe(i)"> 
     {{hero}} 
    </li> 
    </ul> 
    `, 
    animations: [ 
    trigger('flyInOut', [ 
    state('in', style({transform: 'translateX(0)'})), 
    transition('void => *', [ 
     animate(300, keyframes([ 
     style({opacity: 0, transform: 'translateX(-100%)', offset: 0}), 
     style({opacity: 1, transform: 'translateX(15px)', offset: 0.3}), 
     style({opacity: 1, transform: 'translateX(0)',  offset: 1.0}) 
     ])) 
    ]), 
    transition('* => void', [ 
     animate(300, keyframes([ 
     style({opacity: 1, transform: 'translateX(0)',  offset: 0}), 
     style({opacity: 1, transform: 'translateX(-15px)', offset: 0.7}), 
     style({opacity: 0, transform: 'translateX(100%)', offset: 1.0}) 
     ])) 
    ]) 
    ]) 
] 
}) 
export class App { 
    heroes: any[] = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India']; 

    next: number = 0; 
    staggeringHeroes: any[] = []; 

    constructor(){ 
    this.doNext(); 
    } 

    doNext() { 
    if(this.next < this.heroes.length) { 
     this.staggeringHeroes.push(this.heroes[this.next++]); 
    } 
    } 

    removeMe(i) { 
    this.staggeringHeroes.splice(i, 1); 
    } 
} 
+0

In Ihrem Fall haben Sie einen statischen Bereich, aber was können wir tun, wenn sich das Array ändert? –

0

nutzen zu können, die machen eckige2 Animationen Ich setze eine Zustandseigenschaft auf das iterierte Element und richte dann eine Umschaltfunktion für den mouseover und m ein ouseout funktioniert. Auf diese Weise jedes Element verkapselt ist es animierten Zustand und dann konnte ich es als

Bedarf ändern
<li 
    *ngFor="let item of itemsList" 
    (mouseover)="toogleAnimation(item)" 
    (mouseout)="toogleAnimation(item)" 
>{{ item.name }} 
    <div class="animation_wrapper" [@slideInOut]="item.state"> 
    <span class="glyphicon glyphicon-refresh"></span> 
    <span class="glyphicon glyphicon-trash"></span> 
    </div> 
</li> 
+0

Soll 'slideInOut' in Ihrem Beispiel' flyInOut' sein? – ryanm

+0

Wenn Sie in den früheren Posts auf das flyInOut verweisen, könnte man sagen, dass es das sein soll, aber das ist ein wörtliches Beispiel aus meinem Code. Denken Sie daran, dass Sie Namen vergeben können, so lange Sie sie richtig aufrufen – jredd

+1

Ja, in der Tat, um (fast) alles zu benennen. Ich wollte nur sehen, wie Ihre Antwort der Frage des OP entsprach. Danke und frohes neues Jahr! – ryanm

0

, was Sie wollen, von der Zeit zwischen jedem Element in der Liste, diesen Code sehen. ändern die Datei css .scss

wie diese https://codepen.io/jhenriquez856/pen/baPagq

$total-items: 5; 
 

 
body { 
 
    font-family: sans-serif; 
 
    background: #111; 
 
    color: #fff; 
 
} 
 

 
ul { 
 
    width: 300px; 
 
    left: 50%; 
 
    margin-top: 25px; 
 
    margin-left: -150px; 
 
    
 
    position: absolute; 
 
} 
 

 
li { 
 
    position: relative; 
 
    display: block; 
 
    border: 1px solid hotpink; 
 
    margin-bottom: 5px; 
 
    padding: 10px; 
 
    text-align: center; 
 
    text-transform: uppercase; 
 
    animation: fadeIn 0.5s linear; 
 
    animation-fill-mode: both; 
 
} 
 

 
// Set delay per List Item 
 
@for $i from 1 through $total-items { 
 
    li:nth-child(#{$i}) { 
 
    animation-delay: .25s * $i; 
 
    } 
 
} 
 

 
// Keyframe animation 
 
@-webkit-keyframes fadeIn { 
 
    0% { 
 
    opacity: 0; 
 
    } 
 
    75% { 
 
    opacity: 0.5; 
 
    } 
 
    100% { 
 
    opacity: 1; 
 
    } 
 
}
<ul> 
 
    <li>item 1</li> 
 
    <li>item 2</li> 
 
    <li>item 3</li> 
 
    <li>item 4</li> 
 
    <li>item 5</li> 
 
</ul>