MyComponentはサービスを使用してデータを取得し、そのデータをレンダリングします。ただし、ユーザーがログインするまで、サービスはデータを取得できません。ユーザーが最初に '/ myPage'ルートに移動すると、コンテナコンポーネントにログインコンポーネントが表示されます。しかし、ログインコンポーネントが(MyComponentと評価される)ng-contentの代わりにレンダリングされても、MyComponentはangleで初期化され、フェッチし、ログインする前にサービスが早すぎてデータをフェッチする原因となります。したがって、ユーザーが正常にログインし、MyComponent最後にレンダリングすると、初期データサービスで何も返されなかったデータはありません。角度コンポーネントがレンダリングされるときに関数を実行する方法は?
コンポーネントをレンダリングするまでデータの取得を延期するにはどうすればよいですか? MyComponent内のさまざまなライフサイクルメソッドをすべて成功させようと試みました。
app.component
<container>
<router-outlet></router-outlet>
</container>
コンテナコンポーネント
<div *ngIf="!userService.getLoggedInUser()">
<login></login>
</div>
<div *ngIf="userService.getLoggedInUser()">
<ng-content></ng-content>
</div>
ルーティングモジュール
const routes: Routes = [
{ path: 'myPage', component: myComponent }
];
私のコンポーネント
export class MyComponent {
data
constructor(private dataService: DataService) {}
ngOnInit() {
//how can i make run this service AFTER the component renders? i know
//ngOnInit is definitely not the correct lifecycle method, but what is?
this.dataService.get().then((data) => this.data = data);
}
}
あなたが探しているのは:https://angular.io/api/core/AfterViewInitです。 OnInitと同じ方法で使用します(インポート、実装、ngAfterViewInit(){...}) –
私はあなたが間違った方法で行くと思います。あなたのケースでは、どこにでもチェックユーザーのためにあなたの条件を追加する必要があるので、ログに記録されます。つまり、コンポーネントがロードされ、すべてのjsファイルを検索して確認できるということです。そしておそらく誰かがxss攻撃をすることができます。角度をつけて、我々はガードを構築するより良い方法を持っています。そこに良い例があります:http://jasonwatmore.com/post/2016/09/29/angular-2-user-registration-and-login-example-tutorial –
@RomaSkydanの情報に感謝します。しかし、私はセキュリティの問題が何であるか正確には分かりません。はい、クライアントはログインしているユーザーを確認しますが、サーバー側にトークンがあるセキュリティチェックもあります(これがユーザーがログインした後にデータを取得する必要がある理由です)。セキュリティ上の問題がどこにあるのか正確に説明できますか? – Simon