【发布时间】: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