【问题标题】:Angular 4 Observable service not working for an api http getAngular 4 Observable 服务不适用于 api http get
【发布时间】:2018-02-14 18:30:41
【问题描述】:

Angular 4 Observable 服务不适用于 api http get。

返回 observable 的 http 似乎不起作用。

我正在使用新的 HttpClient

这是我得到的错误:

错误:找不到不同的支持对象“[object Object]” 输入“对象”。 NgFor 仅支持绑定到 Iterables,例如 数组。

解决方案?

似乎不喜欢 Observable 去 ngFor。也许我需要 做一个switchMap?在组件中。

这是我的 http 服务调用:

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/retry';

import { User } from "../models/user.model";

@Injectable()

export class UserService {
    private baseUrl = "http://jsonplaceholder.typicode.com/users";

    constructor(private http: HttpClient) {
    }

    getUsers(): Observable<User[]> {        
        return this.http.get<User[]>(this.baseUrl)
          .retry(2)
          .catch(e => this.handleError("Get Users Error", e));
    }

    private handleError(errorMessage: string, error: Object): any {
      console.log(errorMessage, error);
    }
};

这是我的 html:

<div class="column" *ngFor="let user of listOfUsers | async; let i = index">
    <p>{{i + 1}}.{{user.name}}</p>
</div>

这是我的组件:

import { Component, OnInit } from "@angular/core";
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/do';

import { UserService } from "../../services/user.service";
import { User } from "../../models/user.model";

@Component({
  selector: "home-users",
  templateUrl: "./home.component.html"
})

export class HomeComponent implements OnInit {
  private listOfUsers: Observable<User[]>;
  loading: boolean;

  constructor(private userService: UserService) {}

  ngOnInit() {
    this.getUsers();
  }

  getUsers(): void {
    this.loading = true;
    this.listOfUsers = this.userService.getUsers().do(_ => this.loading = false);
  }
}

这是我的模特:

export class User {
  name: string;
};

【问题讨论】:

  • 如果您使用 angualr 4.3,请使用以下教程 angular.io/guide/http,因为 HttpClient 不需要地图和 json。

标签: angular angular-http angular-observable


【解决方案1】:

进行以下更改:

export interface User {
  name: string;
};

@Injectable()

export class UserService {
    private baseUrl = "http://jsonplaceholder.typicode.com/users";

    constructor(private http: HttpClient) {
    }

    getUsers(): Observable<User[]> {
        return this.http.get<User[]>(this.baseUrl)
      .retry(2)
      .catch(e => this.handleError("Get Users Error", e));
}

private handleError(errorMessage: string, error: HttpErrorResponse | any){
  console.log(errorMessage, error);
}

}

新的HttpClient 没有使用json 方法定义Response 类。现在开发人员可以使用带有类型参数的 HTTP 方法来代替它。

这是我的控制台错误的屏幕截图:

【讨论】:

  • 好的,我已经在上面添加了您的服务更改。我现在收到此错误:错误:找不到类型为“对象”的不同支持对象“[对象对象]”。 NgFor 只支持绑定到 Arrays 等 Iterables。
  • 似乎不喜欢 Observable 去 ngFor。也许我需要做一个switchMap?在组件中。如果是这样我如何为组件执行此操作?
  • 我得到了同样的错误:我认为这是因为我的组件收到了这个: Observable> 当它可能需要一个 switchMap 到 Observable 但我不是确定怎么做?
  • 您的组件应该接收到服务接口中定义的 Observable。也许您的端点地址没有返回数组
  • 在组件中从listOfUsers中移除private修饰符
【解决方案2】:

如果您将 Home 组件更改为以下内容,肯定会解决您的问题吗?

getUsers(): void {
    this.loading = true;
    this.userService.getUsers().subscribe((users) => {
            // --> Observable<T> returns here
            this.listOfUsers = users; // or if json: this.listOfUsers = users.json();
        },
        (errors) => {
            // --> Errors are returned here
        },
        () => {
            // --> always called when finished
            this.loading = false;
        });
}

编辑

您必须为异步映射返回的数据:

this.listOfUsers = this.userService.getUsers().map((data)=> return data.json() || []);

this.works 对我来说很好,看看这篇文章:angular-2-async-pipe-example

【讨论】:

  • 是的,但我想使用 |在我的 ngFor 中异步,因此不必订阅
  • 当我使用 |异步:错误:找不到“object”类型的不同支持对象“[object Object]”。 NgFor 只支持绑定到 Arrays 等 Iterables。
猜你喜欢
  • 2019-02-07
  • 1970-01-01
  • 2015-08-07
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2021-05-23
相关资源
最近更新 更多