Angular 7では、Observableから結果を抽出するにはどうすればよいですか?

デイブ

Rail5バックエンドでAngular7を使用しています。Rails5バックエンドとやり取りするために使用するサービスがあります...

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';

@Injectable()
export class CurrencyService {
  constructor(private _http: HttpClient) { }

  index() {
    let ret = this._http.get<Object[]>('api/currencies').map(r => r);
    console.log(ret);
    return ret;
  }

  refresh() {
    return this._http.get<Object[]>('api/refresh').map(r => r);
  }
}

これは、サービスと対話するsrc / app /app.component.tsファイルにあります...

import { CurrencyService } from './../shared/currency.service';
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {
  currencies = [];
  title = 'app';
  apiStatus: string;
  constructor(private _currencySrv: CurrencyService) { }

  ngOnInit() {
    this._currencySrv.index<Object[]>().subscribe(
      currencies => this.currencies = currencies);
  }

  refresh() {
    this._currencySrv.refresh<Object[]>().subscribe(
      currencies => this.currencies = currencies);
  }

}

返されたObservableオブジェクトから「index」と「refresh」の呼び出しの結果を抽出するにはどうすればよいですか?ngForを使用して「currencies」メンバー変数を反復処理しようとすると、エラーが発生します

ERROR TypeError: Cannot read property 'name' of undefined
    at Object.eval [as updateRenderer] (AppComponent.html:4)
    at Object.debugUpdateRenderer [as updateRenderer] (core.js:14735)
    at checkAndUpdateView (core.js:13849)
    at callViewAction (core.js:14195)
    at execComponentViewsAction (core.js:14127)
    at checkAndUpdateView (core.js:13850)
    at callWithDebugContext (core.js:15098)
    at Object.debugCheckAndUpdateView [as checkAndUpdateView] (core.js:14635)
    at ViewRef_.detectChanges (core.js:11619)
    at eval (core.js:5918)

結果は「data」というフィールドにラップされていると思いますが、「ngserve」を使用してAngularサーバーを起動しようとすると、あらゆる種類のコンパイルエラーなしでフィールドを抽出する適切な方法がわかりません。

編集: src / app /app.component.htmlにあります

<!--The content below is only a placeholder and can be replaced.-->
<ul>
  <ng-container *ngIf="currencies?.length">
  <li *ngFor="let currency of currencies">
    <div>{{currency.name}}</div>
    <div>{{currency.country}}</div>
    <div>{{currency.rate / 100}}</div>
  </li>
  </ng-container>
</ul>

更新

それでも、データは表示されません。

nash11

コードで修正する必要のある問題はたくさんあります。@JBNizetはすでにほとんどの問題について言及しているようです。

まずはサービスから始めましょう。

  • 前述のように、rxjs6Angularアプリケーションで使用している場合は、使用したrxjs6構文の代わりにパイプ可能な演算子の構文を使用できますrxjs5(出典:docs
  • 変更importのための場所をObservableするrxjsmapしますrxjs/operators(出典:docs
  • import { Http } from '@angular/http';冗長です。このパッケージは非推奨です。@angular/common/http代わりに使用してください(出典:docs
  • Object非プリミティブボックス化オブジェクトを指すため、使用しないでください(出典:docs)。代わりに、anyまたはさらに良い方法として、バックエンド応答を定義するインターフェースを作成してください。
  • あなたのmap現在の書き方では、何もしません。代わりに、バックエンドがオブジェクトを返すdataので、を使用しmapdataだけを返すことができます
  • あなたのrefreshAPIが何をするのかはわかりませが、currenciesAPIと同じデータを取得するだけの場合は、不要のようです。他のデータが含まれているかどうかわからないので、答えはそのままにしておきます。

このすべてを念頭に置いて、あなたCurrencyServiceは今のようになります

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

import { CurrenciesResponse, Currency } from 'path/to/your/interface';

@Injectable()
export class CurrencyService {
    constructor(
        private _http: HttpClient
    ) { }

    index(): Observable<Currency[]> {
        return this._http.get<CurrenciesResponse>('api/currencies').pipe(
            map((res: CurrenciesResponse) => res.data)
        );
    }

    refresh(): Observable<Currency[]> {
        return this._http.get<CurrenciesResponse>('api/refresh').pipe(
            map((res: CurrenciesResponse) => res.data)
        );
    }
}

インターフェイスは次のようになります

export interface CurrenciesResponse {
    data: Currency[];
    // Add other backend response properties here if present
}

export interface Currency {
    name: string;
    country: string;
    rate: number;
    // ...
}

インターフェイスを別のファイルに追加し、必要に応じてインポートします。

コンポーネントには、問題が1つしかないようです。あなたが起動したときに型引数を指定する必要はありませんindex()refresh()からcurrencyService、彼らは一般的な方法ではないからです。IDEは通常、次のようなエラーでこれについて警告する必要がありますExpected 0 type arguments, but got 1

currencies: Currency[] = [];
title: string = 'app';
apiStatus: string;

constructor(
    private _currencySrv: CurrencyService
) { }

ngOnInit() {
    this._currencySrv.index().subscribe(currencies => {
        this.currencies = currencies;
    });
}

refresh() {
    this._currencySrv.refresh().subscribe(currencies => {
        this.currencies = currencies;
    });
}

最後に、HTMLでは、データが含まれていない限り何も印刷されないため、ngIfは冗長です。ngForcurrencies

<ul *ngFor="let currency of currencies">
    <li>
        <div>{{currency.name}}</div>
        <div>{{currency.country}}</div>
        <div>{{currency.rate / 100}}</div>
    </li>
</ul>

StackBlitzの実際の例を次に示します。angular-in-memory-web-apiAPI応答に使用しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Observable Angular 7から適切に登録を解除するにはどうすればよいですか?

分類Dev

Angular 7-トークンの更新Observableを共有するにはどうすればよいですか?

分類Dev

クラスからの関数の結果をangular / typescriptでビューに表示するにはどうすればよいですか?

分類Dev

URLの結果に基づいてAngular7 Webサイトのcss要素を変更するにはどうすればよいですか?

分類Dev

Angular 6 / RxJS 6でhttp.get()からの結果を処理するにはどうすればよいですか?

分類Dev

* ngFor Loop Angular 6から生成された同様の結果の数を表示するにはどうすればよいですか?

分類Dev

2つの異なるRESTAPIからAngularの$ resourceの結果を変更するにはどうすればよいですか?

分類Dev

Angular 7のFirestoreクエリからデータのObservableを取得するにはどうすればよいですか?

分類Dev

Ionic 4 / Angular7の@ViewChildからnativeElementを取得するにはどうすればよいですか?

分類Dev

Angularで、クラスの変数を関数の結果になるように設定するにはどうすればよいですか?

分類Dev

Angular2テストでObservable.throwをモックするにはどうすればよいですか?

分類Dev

Angular2でobservableの応答を取得するにはどうすればよいですか?

分類Dev

AngularのObservableでngForを使用するにはどうすればよいですか?

分類Dev

Angular 4または7でObservableプロパティを設定するにはどうすればよいですか?

分類Dev

Angularマテリアルでハング効果を作成するにはどうすればよいですか?

分類Dev

mat-tab-groupの遷移効果でAngularを変更するにはどうすればよいですか?

分類Dev

フィルタリングされた結果の配列の長さをangular4で取得するにはどうすればよいですか?

分類Dev

Angular 2 / Ionic 3で複数のObservableからエラー処理を実行するにはどうすればよいですか?

分類Dev

サブスクリプションが完了した後、Angularでpromise / observableから変数を設定するにはどうすればよいですか?

分類Dev

AngularでBluebirdを使用するにはどうすればよいですか?

分類Dev

Angular 2でJSONをPOSTするにはどうすればよいですか?

分類Dev

Angular 2でJSONをPOSTするにはどうすればよいですか?

分類Dev

AngularでJSONを提供するにはどうすればよいですか?

分類Dev

AngularでIndexedDBを使用するにはどうすればよいですか?

分類Dev

Angular 4でCKEditorを使用するにはどうすればよいですか?

分類Dev

Angular 4でCKEditorを使用するにはどうすればよいですか?

分類Dev

Angularでforloopを使用するにはどうすればよいですか

分類Dev

AngularでsetIntervalを停止するにはどうすればよいですか?

分類Dev

URLをAngularで取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    Observable Angular 7から適切に登録を解除するにはどうすればよいですか?

  2. 2

    Angular 7-トークンの更新Observableを共有するにはどうすればよいですか?

  3. 3

    クラスからの関数の結果をangular / typescriptでビューに表示するにはどうすればよいですか?

  4. 4

    URLの結果に基づいてAngular7 Webサイトのcss要素を変更するにはどうすればよいですか?

  5. 5

    Angular 6 / RxJS 6でhttp.get()からの結果を処理するにはどうすればよいですか?

  6. 6

    * ngFor Loop Angular 6から生成された同様の結果の数を表示するにはどうすればよいですか?

  7. 7

    2つの異なるRESTAPIからAngularの$ resourceの結果を変更するにはどうすればよいですか?

  8. 8

    Angular 7のFirestoreクエリからデータのObservableを取得するにはどうすればよいですか?

  9. 9

    Ionic 4 / Angular7の@ViewChildからnativeElementを取得するにはどうすればよいですか?

  10. 10

    Angularで、クラスの変数を関数の結果になるように設定するにはどうすればよいですか?

  11. 11

    Angular2テストでObservable.throwをモックするにはどうすればよいですか?

  12. 12

    Angular2でobservableの応答を取得するにはどうすればよいですか?

  13. 13

    AngularのObservableでngForを使用するにはどうすればよいですか?

  14. 14

    Angular 4または7でObservableプロパティを設定するにはどうすればよいですか?

  15. 15

    Angularマテリアルでハング効果を作成するにはどうすればよいですか?

  16. 16

    mat-tab-groupの遷移効果でAngularを変更するにはどうすればよいですか?

  17. 17

    フィルタリングされた結果の配列の長さをangular4で取得するにはどうすればよいですか?

  18. 18

    Angular 2 / Ionic 3で複数のObservableからエラー処理を実行するにはどうすればよいですか?

  19. 19

    サブスクリプションが完了した後、Angularでpromise / observableから変数を設定するにはどうすればよいですか?

  20. 20

    AngularでBluebirdを使用するにはどうすればよいですか?

  21. 21

    Angular 2でJSONをPOSTするにはどうすればよいですか?

  22. 22

    Angular 2でJSONをPOSTするにはどうすればよいですか?

  23. 23

    AngularでJSONを提供するにはどうすればよいですか?

  24. 24

    AngularでIndexedDBを使用するにはどうすればよいですか?

  25. 25

    Angular 4でCKEditorを使用するにはどうすればよいですか?

  26. 26

    Angular 4でCKEditorを使用するにはどうすればよいですか?

  27. 27

    Angularでforloopを使用するにはどうすればよいですか

  28. 28

    AngularでsetIntervalを停止するにはどうすればよいですか?

  29. 29

    URLをAngularで取得するにはどうすればよいですか?

ホットタグ

アーカイブ