2017-03-17 4 views
4

Firebaseのリアルタイムデータベースを購読していますので、何かを提出するとすぐにjQueryやajaxを必要とせずにビューにレンダリングされます。新たにレンダリングされた要素のアニメーションですが、ページのロードではありません

DOMに新しい要素が追加されたときにそのdivbackground-colorが緑色でゆっくりと消えるように、そのような要素のレンダリングをアニメーション化したいと思います。私がしたくないのは、このクラスのすべてのdivがこのアニメーションを読み込むことです。

私は元を行う方法を知っている:

@keyframes green-fade { 
    0% {background: rgb(173, 235, 173);} 
    100% {background: none;} 
} 

.post-div { 
    animation: green-fade 5s ease-in 1; 
} 

しかし、もちろんこのアニメーションは、負荷を含め、このクラスのためにそれをレンダリングしていますいつでも起こります。

私は「角度2ウェイ」に興味があります。

答えて

5

は、これを行うための簡単な方法があります:あなたが抑制したい場合は、次の、ビューの初期化時にアニメーションを入力するだけで、次のアニメーションでそれをラップ:

template: ` 
    <div [@preventInitialChildAnimations]> 
    <div [@someAnimation]>...</div> 
    </div> 
`, 
animations: [ 
    trigger('preventInitialChildAnimations', [ 
    transition(':enter', [ 
     query(':enter', [], {optional: true}) 
    ]) 
    ]), 
    ... 
] 
+0

これは私にとって正解でした。ありがとう! – IRCraziestTaxi

+0

現在のAngularバージョンに対処するため、受け入れられた回答を更新しました。 –

+0

4.2.4で私のために働いていない、アニメーションはまだページの読み込み時に発生します – Vignesh

3

アイテムがネットワークを通過したときにアイテムの状態をチェックするトリガを追加します。ここでは、itemStatenewのときにアニメーションをトリガーしています。

trigger('itemState', [ 
 
     transition('* => new', animate(5000, keyframes([ 
 
     style({ backgroundColor: 'red', offset: 0 }), 
 
     style({ backgroundColor: '*', offset: 1.0 }) 
 
     ]))),

あなたのトリガーアイテムの状態への参照を与える、とするとき、アニメーションが終了ヌルに設定します。

<div [@itemState]="someItem.itemState" (@itemState.done)="someItem.itemState=''">

あなたが新しいとしてフラグそれらができるようにあなたの記事へitemStateプロパティを追加してください!

+0

何らかのローカルデータストアを使用していない場合は、itemState.doneのAPIコールを行う必要があります。例えば、アイテムの状態を 'null'に設定する'(@ itemState.done)= "someApiCall()' 'old'をAPIレベルで使用し、' old'または 'null'をローカルに設定します。 –

+0

ええ、私はちょうどデータベース呼び出しを行うだろうと思った。ここでも、私はAngularFireを使用しているので、データベース上の項目状態の変更はリアルタイムで反映されます。 –

+0

これはもちろん、ポストが作成されたときにそのページを見ているユーザーにのみアニメーションを表示します。うーん、多分、経過時間の後にAPI呼び出しを行う何か? –

2

初期ビューレンダリングの終了後、ライフサイクルフックAfterViewInitを使用してアニメーションをアクティブにすることができます。角度4.25以来

https://embed.plnkr.co/5l1kf5lMLEXSE8pNzqik/

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div *ngFor="let item of items" [@greenFade]="animate ? 'in' : null"> 
     {{item}} 
    </div> 

    <button (click)="addItem()">add</button> 
    `, 
    animations: [ 
    trigger('greenFade', [ 
     transition('void => in', [style({background: 'rgb(173, 235, 173)'}), animate('5s ease-in')]) 
    ]) 
    ] 
}) 
class App implements AfterViewInit { 
    constructor(private cdRef: ChangeDetectorRef){} 

    items: String = ['Item','Item','Item']; 
    addItem(){ 
    this.items.push('Item'); 
    } 

    animate: boolean; 
    ngAfterViewInit(){ 
    this.animate = true; 
    this.cdRef.detectChanges(); 
    } 
} 
+0

ビューがレンダリングされるたびにアニメーションがトリガーされませんか? –

+0

あなたはどう思いますか? @greenFade属性がvoidから 'in'に変わると、各項目のアニメーションがトリガされます。つまり、最初の値が 'in'の場合です。これは一度だけ起こります。最初のアイテムについては、まったく起こりません。それらはvoidからnullに、そして次にnullから 'in'に変わります。 –

+0

ああ、そうですよ!この回答と受け入れられた回答のメリットを見てみましょう。もちろん、バックエンドに値を設定する必要はありません。私はそれがあなたのユースケースに依存すると思います。 –

関連する問題