質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3568閲覧

Angularでサーバからのレスポンスを取得後その値を画面に表示

kuuritar

総合スコア38

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2018/11/28 15:15

編集2018/11/28 15:47

Angularで以下のようなことがやりたいと思っています。

  1. あるボタンをクリック後、記事表示ページ(article.componentとします)を表示
  2. article.componentのngOnInitでサーバにgetで記事の情報をリクエスト。(非同期)
  3. レスポンスが返ってきた後、画面に記事の内容を表示

まず、最初は何も考えず、サーバにリクエストを投げる関数を作り、その関数をngOnInitで呼んでました。
この場合は初期表示時に、まだサーバからレスポンスが返ってきてないので画面に何も表示されませんでした。

次にサーバにリクエストを投げる関数の最後で@angular/routerのnavigateByUrlを使い、同画面を再表示するようにすることで、正しく記事の内容を表示できました。

しかし、何かこのやり方はダサく感じており、Angularのお作法的にはどうするのが正解なのか教えてください。

以下ソースコードです。

Angualr

1import { Component, OnInit } from '@angular/core'; 2import { ArticleService } from './article.service'; 3import { Article } from 'src/app/shared/models/article'; 4import { Router } from '@angular/router'; 5 6@Component({ 7 selector: 'app-article', 8 templateUrl: './article.component.html', 9 styleUrls: ['./article.component.scss'] 10}) 11export class ArticleComponent implements OnInit { 12 article: Article; 13 14 constructor(private articleService: ArticleService, 15 private router: Router) { } 16 17 ngOnInit() { 18 this.getArticle(1); 19 } 20 21 getArticle(articleId: number) { 22 this.articleService.getArticle(articleId).subscribe( 23 response => { 24 this.article = response; 25 this.router.navigateByUrl('/'); 26 } 27 ); 28 } 29}
xenbeat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BlueMoon

2018/11/28 21:33

articleが非同期更新されるのに画面表示が更新されない(双方向バインドができていない)趣旨の質問でしょうか。そうでしたらarticle.component.htmlの内容も記載できますか?
guest

回答2

0

記事の情報を取得してからページを表示したいとの事なのでRouterResolveを使うのが良いかと
https://angular.jp/api/router/Resolve
https://angular.io/guide/router#fetch-data-before-navigating

resolveを使えばデータが揃った時点で画面遷移させることができます

投稿2018/11/29 01:20

teikoku-penguin

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

サーバにリクエストを投げる関数の最後で@angular/routerのnavigateByUrlを使い、同画面を再表示するようにすることで、正しく記事の内容を表示できました。

何かこのやり方はダサく感じており、Angularのお作法的にはどうするのが正解なのか教えてください

Angularのお作法的には、rxjsObservableを使って非同期処理をします。

サーバにリクエストを投げる(サーバーからデータを取得する)関数はObservableを返却し、関数を呼び出す方はそれをsubscribeしてその中でプロパティを設定してあげます。

もちろんPromiseとかでも非同期処理できますが、AngularのHttpClient.get()Observableを返すため、それをそのまま流してあげるのがAngular的にはベターということになります。

投稿2018/11/28 15:43

xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuuritar

2018/11/28 15:49

すいません、少し言葉足らずでした。 ソースコードを追記しましたので、こちらを見ていただけるとわかりやすいかと思います。 こうすると非同期なのでcomponent読み込み時にはまだthis.articleに値が入っておらず、記事が表示されていません。 ですので、取得後にthis.router.navigateByUrl('/');こいつで表示させているのですが、何かダサく感じている、という感じです。
xenbeat

2018/11/28 18:16 編集

Observableで処理されていたんですね。 > 非同期なのでcomponent読み込み時にはまだthis.articleに値が入っておらず、記事が表示されていません。 念のためですが、これは当たり前なのでこれが問題ではないですよね? > 取得後にthis.router.navigateByUrl('/');こいつで表示させているのですが、何かダサく感じている これがなくても取得後にデータ表示できると思うのですが、あえてこのダサいと感じられているものを入れている理由を知りたいです。
kuuritar

2018/12/02 15:50

すいません、こちら私の記載方法が悪かったようです。 this.articleが読み込み済の場合、表示、読み込んでいない場合は表示しないようにすることで、画面に正しく表示させることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問