1

私のルート間に素晴らしいアニメーションがあり、データがロードされた後にのみコンポーネントを表示するためにすべてのコンポーネントにワープを追加しました。 :コンポーネントのデータがサービスからロードされた後にルータ間でアニメーションを開始する方法

私のコンポーネントHTMLファイル:

<div *ngIf="isDataAvailable"> 
    ...my component html template... 
</div> 

と、これは私のTSファイルである:私のルートTSファイル内

isDataAvailable:boolean = false; 
ngOnInit() { 
    this.subscription = this.clientsService.getClients().subscribe(
     (result:any) => { 
     this.data = result.clients; 
     this.isDataAvailable = true; 
     } 
    ); 
} 

私はこのアニメーションの設定を持っている:

import { customTransition } from './custom-transition.animation'; 

@Component({ 
    selector: 'app-master', 
    templateUrl: './master.component.html', 
    styleUrls: [ 
    './master.component.css', 
    ], 
    animations: [customTransition()], 
    encapsulation: ViewEncapsulation.None 
}) 

、これはルート・ファイルのための私のHTMLテンプレートです

<ng2-page-transition [animation]="customAnimation"> 
    <div [@ng2ElementState]="customAnimation.state"> 
     <router-outlet></router-outlet> 
    </div> 
</ng2-page-transition> 

私の問題は今、いくつかのコンポーネントが高速にロードされ、一部がゆっくりなぜなら、彼らが持っているデータをロードしていると、これは罰金であるということですユーザーがゆっくりと読み込んでいるものにはアニメーションが表示されず、準備ができたらコンポーネントだけが表示されます。

データがロードされてから、 をロードした後、アニメーションを開始したいと思うかもしれません。おそらく、コンポーネントの準備が整う前に、いくつかのプリローダーを表示することさえできます。

ありがとうございました!

EDIT:

これは私のcustomTransition.animation.tsファイルです:アニメーションは、ルート・ファイル内のコンポーネントではなく内にある必要があります

//custom-transition.animation.ts 
import {trigger, state, animate, style, transition, AnimationEntryMetadata} from '@angular/core'; 

export function customTransition():AnimationEntryMetadata { 
    return slideOutAndIn(); 
} 

function slideOutAndIn():AnimationEntryMetadata { 
    return trigger('ng2ElementState', [ 
    state('leave', style({ 
     position:'inherit', 
     display:'block', 
     width:'100%' 
    })), 
    state('enter', style({ 
     position:'inherit', 
     display:'block', 
     width:'100%' 
    })), 
    transition('* => enter', [ 
     style({ 
      transform: 'translateY(10%)', 
      opacity: 0 
     }), 
     animate('0.5s ease-in-out', style({ 
      transform: 'translateY(0%)', 
      opacity: 1 
     })) 
    ]), 
    transition('* => leave', [ 
     style({ 
     transform: 'translateY(0%)', 
     opacity: 0 
     }), 
     animate('0.5s ease-in-out', style({ 
     transform: 'translateY(-10%)', 
     opacity: 0 
     })) 
    ]), 
    ]); 
} 
+0

あなたの目的のために、アニメーショントリガーはルータのアウトレットの内部コンポーネントに含まれるべきだと思います。いずれかの方法。内部コンポーネントの 'ngOnInit'がいつ廃棄されたかを知り、それをアニメーションのトリガとして含めるときに、オブザーバブルを使用してサービスを行うことができます。おそらく、より簡単な解決策がマスターから提案されるでしょう。どれどれ。興味ある。 – Sam

+0

@Sam私はあなたが正しいと思うかもしれません。それは私のために働くコンポーネントの中でアニメーションをトリガーする場合、私は質問にアニメーションを追加します - 私のコンポーネントの中でそれを実行する方法を教えてください?私はangle2で少し新しいです... –

+0

私は家に到着しました。遅いですか?大丈夫だ?私が私にそれを知らせるのを助けることができるなら:) – Sam

答えて

2

、 ので、これは私の結果である:

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

@Component({ 
    selector: 'app-clients', 
    templateUrl: './clients.component.html', 
    styleUrls: ['./clients.component.css'], 
    animations: [trigger('slideIn', [ 
    state('inactive', style({ 
     transform: 'translateY(10%)', 
      opacity: 0 
    })), 
    state('active', style({ 
     transform: 'translateY(0%)', 
      opacity: 1 
    })), 
    transition('active => inactive', animate('.6s ease')), 
    transition('inactive => active', animate('.6s ease'))] 
    ] 
}) 

export class ClientsComponent implements OnInit,OnDestroy { 
    state:string = "inactive"; 

    constructor(private clientsService: ClientsService) {} 

    ngOnInit() { 
    this.updateData(); 
    } 

    updateData(){ 
    this.subscription = this.clientsService.getClients().subscribe(
     (result:any) => { 
     this.data = result.clients; 
     this.state = "active"; 
     } 
    ); 
    } 
} 
関連する問題