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

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

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

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

7185閲覧

Angular コンポーネント間でのデータ(値)の受け渡しについて

sweden1

総合スコア59

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2017/09/06 05:23

###前提・実現したいこと
コンポーネント間でのデータ(値)の受け渡しで苦戦をしている初心者です。
seviceにあるものをコンポーネントにひっぱてくる手法はわかりましたが、コンポーネントの値を他のコンポーネントへserviceを用いて受けわたすにはどうしたら良いでしょうか。

ちなみに、ログイン成功時に他の画面に移って、現在のユーザーを表示したいと考えております。

###該当のソースコード

typescript

1//conpornent.ts 2 3 4 this.authService.logIn(body).then((response: any) => { 5 // console.log(response); 6 if(response.status === 200){ 7 8 console.log("true"); 9 let data = response.json().data; 10 // console.log(data); 11 // console.log(data.email); 12 // console.log(data.firstName); 13 // console.log(data.lastName); 14 15 this.router.navigate(['/']) 16 17 18 } 19 }).catch(() => { 20 this.router.navigate(['/login']) 21 this.msg = 'Username or password is incorrect'; 22 //this.loading = false; 23 console.log(this.msg) 24 }); 25 } 26

typescript

1//sevice.ts 2 getCurrentUser(data:any){ 3 console.log(data); 4 return data 5 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

シングルトンなserviceにすることで、どのコンポーネントにも同じインスタンスのserviceをDIできるのでデータの受け渡しにも使えます。

Angularは階層的なDIシステムで、コンポーネントのprovidersにあれば使う、なければ親をたどります。
これを利用すると親子間のコンポーネントだけで共有といったことが可能です。

一番簡単なシングルトンにする方法は、app.module.ts等の一か所でしかprovidersを設定しないことです。大元のproviderから提供されるインスタンスを共有するため、providerがuseClassでもuseValueでも実質シングルトンな挙動になります。

公式ドキュメント:singleton-services

投稿2017/09/07 03:37

shimitei

総合スコア799

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

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

sweden1

2017/09/07 06:47

ご返答誠にありがとうございます。 例えばなのですが、A.cnpornent.tsでlet data = 'abcd'と定義しservise.tsの方で getData(data:any){return data}とし、B.cnpornent.tsの方でgetDataでDataの情報を取得したいのですが どうしたら良いでしょうか。 大変初歩的な質問ですいません。 返答していただけるとさいわいです。
shimitei

2017/09/07 07:34

A,Bそれぞれのコンポーネントでデータ共有したいサービスをインジェクションします。 同じインスタンスのサービスをインジェクションすることで、AでセットしたデータをBでゲットすることができます。 サンプルを作りました。 https://embed.plnkr.co/V3QbEGBzQM4ThuTkiU97/ app.tsとpage.component.tsで同じauth.service.tsをインジェクションしています。 app.tsでsetDataしたものをpage.component.tsでgetDataして表示しています。
sweden1

2017/09/07 08:24

大変わかりやすいです。 おかげさまでわかりました。 ありがとうごあいます。
sweden1

2017/09/08 02:25

ちなみにsetDataでデータはセトできたのですが、getdataの方がうまくいかなく、undefinedと表示されてしまいます。 他のコンポーネントではうまくいったのですが、対象のcオンポーネントではうまくいかにです。 お助けいただけると幸いです。
shimitei

2017/09/08 02:42

異なるインスタンスのサービスがインジェクションされているのではないでしょうか? 別のインスタンのためsetDataされていないのでundefinedになります。 Parent and children communicate via a service https://angular.io/guide/component-interaction#bidirectional-service このように親のComponentだけサービスのprovidersを持ち、子には持たせないことで同じインスタンスのサービスがインジェクションされます。 親だけ、もしくはNgModuleのprovidersにだけ設定してください。
sweden1

2017/09/08 04:09

親から子へうまくデータがセットできているのですが. getDataでうまくreturnできないですね。 原因は何でしょうか
shimitei

2017/09/08 05:17

何をもってデータがセットできていると確認できたのか getDataでreturnできないと判断されたのか それだけでは私には原因はわかりません。 Errorが出ているのでしょうか?まだundefinedが返るのでしょうか? とりあえずサービスのコンストラクタでログ出力を行うことで、サービスがシングルトンになっているか確認できるでしょう。ログ出力が1回のみならばシングルトンでしょうし、2回以上出るならシングルトンになっていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問