【问题标题】:casting an observable in angular8在角度 8 中投射一个可观察的
【发布时间】:2019-11-14 19:15:36
【问题描述】:

我无法将 observable 转换为自定义对象的选定字段(BookDetails:假设 Class 具有除 Title 之外的所有变量)。尽管进行了强制转换,但我仍然能够访问与我正在调用服务的组件相对应的 html 文件中的标题。

我有一个返回以下 JSON 的 API:

[{"id":1,
   "Title":"The Intelligence Trap",
   "Description":"Why smart people do stupid things and how to make wiser decisions",
   "Author":"David Robson",
   "FinishDate":"2019-11-08",
   "EShop":"https://www.amazon.in"}]

我需要捕获除了 Title 之外的所有内容,因此我将 myservice.ts 中 http.get 函数的 Observable 输出转换为 BookDetails 类。我创建了一个新组件,我打算在其中使用该服务。我订阅了该服务,但我仍然可以访问相应组件的 html 文件中的 Title。这是预期的行为。

以下是 PullData.service.ts 文件中的代码

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
import { BookDetails } from "../Interfaces/book-details";

@Injectable({
  providedIn: "root"
})
export class PullDataService {
  constructor(private http: HttpClient) {}

  public getDataFromService(): Observable<BookDetails[]> {
    return this.http.get<BookDetails[]>(
      "http://127.0.0.1:8000/Generic/newroute/"
    );
  }

  public getDummyDataFromService(): Observable<BookDetails[]> {
    return this.http.get<BookDetails[]>("/app/data/dummy.json");
  }
}

这是来自 BookDetails.ts 的代码

import { Url } from "url";

export class BookDetails {
  id: number;
  Author: string;
  FinishDate: Date;
  Description: string;
  EShop: Url;
}

我也试过这个作为界面..无济于事。 “网址”在 node_package 中可用。 请注意这里没有标题!

**import { Url } from "url";
export class BookDetails {
  id: number;
  Author: string;
  FinishDate: Date;
  Description: string;
  EShop: Url;
}**

这是组件的打字稿文件

import { Component, OnInit } from "@angular/core";
import { PullDataService } from "../PullData/pull-data.service";
import { BookDetails } from "../Interfaces/book-details";

@Component({
  selector: "app-roles",
  templateUrl: "./roles.component.html",
  styleUrls: ["./roles.component.scss"]
})
export class RolesComponent implements OnInit {
  public books: BookDetails[];

  constructor(private pds: PullDataService) {}

  ngOnInit() {
    this.pds.getDataFromService().subscribe(data => (this.books = data));
  }
}

这是comp的html文件

<ul>
  <li *ngFor="let book of books">
    Title: {{ book.Title }}
  </li>
</ul>

我使用的是 Angular 8。页面上没有错误,并且输出非常整齐的标题行,用于我的数据库中的所有记录。有人可以帮我知道我在这里做错了什么吗?我累了! :(

【问题讨论】:

  • 您当前只是告诉编译器您期望的响应是BookDetails 类型。您需要从响应中说明您想要哪些属性,这不是“自动”完成的。
  • 好的。但是 get 函数的返回类型不是 BookDetails 数组的 Observable 吗? BookDetails 没有这个名为 t 的变量
  • 是的,你是在告诉编译器...“相信我,我知道这个http请求返回的类型是BookDetails”,编译器信任你。没有运行时检查,请求返回的是所有数据,除非你明确告诉你想要什么,我回答了一个关于同一问题的问题:stackoverflow.com/questions/58662333/…
  • 感谢 AJT。我深信,选角不是我想的那样。我需要创建一个对象和地图。

标签: angular typescript


【解决方案1】:

您没有创建BookDetails 类的对象。您正在接收对象并使用它(您仅尝试进行类型转换。它不会更改对象结构。)。如果要排除接收对象的Title 属性,则必须从对象中删除Title 属性,或者需要创建类BookDetails 的对象使用构造函数。

export class BookDetails {
  id: number;
  Author: string;
  FinishDate: Date;
  Description: string;
  EShop: Url;

  constructor(serverObject) {
    Object.assign(this, serverObject)
  }

}

组件

import { Component, OnInit } from "@angular/core";
import { PullDataService } from "../PullData/pull-data.service";
import { BookDetails } from "../Interfaces/book-details";

@Component({
  selector: "app-roles",
  templateUrl: "./roles.component.html",
  styleUrls: ["./roles.component.scss"]
})
export class RolesComponent implements OnInit {
  public books: BookDetails[];

  constructor(private pds: PullDataService) {}

  ngOnInit() {
    this.pds.getDataFromService().subscribe(data => {
      this.books = data.map(dataObj => new BookDetails(dataObj))
    });

  }
}

【讨论】:

  • 感谢 Jins 在这里帮助我。我对 Obesrvable 的理解是错误的。
  • 好的.. 现在 Object.assign 不能正常工作。 BookDetails 没有 Title,但构造函数中的 Object.assign(this,obj) 没有帮助,即使它应该有帮助。必须单独分配每个变量。看看可能缺少什么会很​​有帮助。
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2020-10-05
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多