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

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

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

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

TypeScript

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

Q&A

解決済

1回答

1347閲覧

AngularでHttpClientを利用して外部インターネットから取得した変数を別ファイルでも利用できるようにしたい

rakiiiii

総合スコア1

Angular

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

TypeScript

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

0グッド

0クリップ

投稿2021/01/08 13:20

編集2021/01/09 05:14

前提

AngularでWebアプリを開発している中での質問です。(超初心者です。)

Test.component.tsではAngularのHttpClientを利用して外部ネットワークに格納されているpageSize配列の0番目を取得しています。(取得できています。)

#質問内容
TestService.tsの「postParam = postParam.set('pageSize','100')」となっているところの'100'を、test.component.tsの「this.response」の値('100'が格納されています。)を代入したいのです。

つまり、
「postParam = postParam.set('pageSize','100')」を
「postParam = postParam.set('pageSize',this.response)」のような形で表したいのですが、方法があればお教えいただけないでしょうか。

何卒よろしくお願いいたします。

該当のソースコード

urlEncoder.ts

TypeScript

1import { HttpParameterCodec } from '@angular/common/http'; 2 3export class UrlEncoder implements HttpParameterCodec { 4 encodeKey(key: string): string { 5 return encodeURIComponent(key); 6 } 7}

###TestService.ts

TypeScript

1import { HttpClient, HttpParams } from '@angular/common/http'; 2import { UrlEncoder } from 'urlEncoder.tsのパス'; 3 4export class TestService{ 5 constructor(private http: HttpClient) { }; 6 7 private setRequestParams(): HttpParams{ 8 let httpParams: HttpParams = new HttpParams({ encoder: new CustomURLEncoder() }); 9 httpParams = httpParams.set('hoge', '1'); //http://-----&hoge=1 になります。 10 } 11 12 paramsGet(path: string, postParams: any = {}): Observable<any> { 13 let postParam: HttpParams = this.setRequestParams(); 14 postParam = postParam.set('pageSize','100')//'100'の部分をthis.responseの値を参照したい。 15 return this.http.get(path, { params: postParam }); 16 } 17};

###test.component.ts

TypeScript

1import TestService from {'Service.tsのパス'}; 2 3@component{ 45} 6 7export class TestComponent implements OnInit{ 8 constructor( 9 private test: TestService, 10 ) 11 12 ngOnInit(){ 13 this.test.paramsGet('http://------').subscribe(res => { 14 this.response = res.pageSize[0] //外部インターネット上のpageSize配列の0番目を取得 15 } 16 ) 17 } 18 19}

試したこと

初心者のため的外れかもしれませんが、this.response廻りをexportできないか試しましたがエラーでした。
this.test.paramsGet().略( 略 )の外からはthis.test.paramsGet().略( 略 )内のthis.responseを参照できないことは理解しています。

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

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

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

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

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

miyabi_takatsuk

2021/01/08 16:37

型がanyだと、そもそもsetメソッドがあるかどうかもわからないかと思いますが・・・。 そのsetメソッドはどんなものでしょうか? 質問者さんの定義したメソッドですか?
rakiiiii

2021/01/09 04:19 編集

ご質問ありがとうございます。 コードをかなり抽象化して載せておりましたので、具体化しました。 以前のコードとは別物になっているため説明は不要かもしれませんが、setはAngularのHttpClient側で定義されているものとなっております。
miyabi_takatsuk

2021/01/09 13:13

つまり、 paramsGetで非同期で取得した値を使い、 paramsGetの中の処理を続けたい、ってことでしょうか?
rakiiiii

2021/01/09 13:17

おっしゃる通りです。 pageSizeのような環境変数(?)をコードに直接書くのではなく、決まった場所から取得したいという意図があります。 そもそも値を取得するためにparamsGetを用いる必要があるのですが、可能でしょうか。
miyabi_takatsuk

2021/01/09 13:24

あれ、でも、 最初の実行では、 paramsGetを実行した時、 "100"という固定値で、 値は取得できてるんですよね? 初回は固定値でいいということですか?
rakiiiii

2021/01/09 13:40 編集

このparamsGetはtest.component.tsのpageSize取得以外にも用いられているので、 paramsGetのみで実装ができないようであれば、 pageSize取得用のparamsGetPageSize(固定値100)を作成し、 他の処理にも用いられるparamsGet(this.responseの値を参照)とは 別で扱うことを検討しています。 (miyabi_takatsuk様のおっしゃる初回は固定値、と同じでしょうか?) 私には、もしこの方法を実行するとしても、this.responseの値をどうやって外に出せばいいのかわからないのです・・・。
miyabi_takatsuk

2021/01/09 13:43

だったら、別メソッドを定義した方がいいですね。 回答に移ります。
guest

回答1

0

ベストアンサー

ちょっと、野暮いですが、下記でいかがかと。
サービスクラスにプロパティを定義し、その値を使う手法です。

typescript

1import { HttpClient, HttpParams } from '@angular/common/http'; 2import { UrlEncoder } from 'urlEncoder.tsのパス'; 3 4export class TestService{ 5 // 外部から取得可能なプロパティを用意 6 public res = ""; 7 constructor(private http: HttpClient) { } 8 9 private setRequestParams(): HttpParams{ 10 let httpParams: HttpParams = new HttpParams({ encoder: new CustomURLEncoder() }); 11 httpParams = httpParams.set('hoge', '1'); //http://-----&hoge=1 になります。 12 } 13 14 paramsGet(path: string, postParams: any = {}): Observable<any> { 15 let postParam: HttpParams = this.setRequestParams(); 16 17 // 固定値を使用 18 postParam = postParam.set('pageSize', '100'); 19 return this.http.get(path, { params: postParam }); 20 } 21 22 paramsGetPageSize(path: string, postParams: any = {}): Observable<any> { 23 let postParam: HttpParams = this.setRequestParams(); 24 25 // resプロパティを使ってリクエスト 26 postParam = postParam.set('pageSize', this.res); 27 return this.http.get(path, { params: postParam }); 28 } 29};

typescript

1import TestService from {'Service.tsのパス'}; 2 3@component{ 45} 6 7export class TestComponent implements OnInit{ 8 constructor( 9 private test: TestService, 10 ) 11 12 ngOnInit(){ 13 this.test.paramsGet('http://------').subscribe(res => { 14 this.response = res.pageSize[0] //外部インターネット上のpageSize配列の0番目を取得 15 16 // サービスのプロパティに代入 17 this.test.res = this.response; 18 19 // 今度は、paramsGetを実行 20 this.test.paramsGetPageSize('http://------').subscribe(res => { 21 // 処理 22 }); 23 } 24 ); 25 } 26 27}

あとは、メソッド名や役割などは適せん調整して下さい。

あと、蛇足ですが、セミコロンの必要箇所といらない箇所があべこべになっているので、そこは一応勉強したほうがいいかと。
(上記は多少直してます)

投稿2021/01/09 13:49

miyabi_takatsuk

総合スコア9555

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

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

rakiiiii

2021/01/10 05:44 編集

ありがとうございます、TestService側でresponseを読み込むことができました。 ただ一点、非同期通信の弊害か、Service側で postParam = postParam.set('pageSize', this.res); の前にthis.resをログで表示すると、undefinedと表示され、 component側で読み込んだ内容が表示されませんでした。 https://teratail.com/questions/129464?link=qa_related_pc の方の質問が類似しているように見えましたので、 参照していじってみたのですが、うまくいきませんでした・・・。 可能であればこちらもご教授いただけないでしょうか。 難しそうであれば本質問はクローズさせていただき、別途質問を作成します。 (追伸) セミコロンに関してはおっしゃる通りです、今まで特に考えずに書いていたため、勉強しなおします!
miyabi_takatsuk

2021/01/10 10:10 編集

> の前にthis.resをログで表示すると、undefinedと表示され、 それは当たり前です。 現状、コンポーネント側からしか、 サービスクラス.resに代入を行なっていませんので。 いつ・何を・どこで・どうするか、 を意識して構文組みましょう。 ようは、4W1Hです。 > 難しそうであれば本質問はクローズさせていただき、別途質問を作成します。 そうですね。 難しいというより、質問要件は満たしておりますので、 上記4W1Hを整理して質問し直すとよいかと。 現状の質問だと、いつ・どこで・取得したいか、 が非常に曖昧なので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問