【发布时间】:2018-09-05 02:21:47
【问题描述】:
我在将 Angular 5 HttpClient 响应映射到具体的 TypeScript 类时遇到问题。
我有以下 Angular 5 类:
export class MaintainableUser {
constructor(public id: string, public name: string, public privileges: string[]) {
}
public hasPrivilege(privilege: string): boolean {
return this.privileges.indexOf(privilege) != -1;
}
public togglePrivilege(privilege: string) {
if (this.hasPrivilege(privilege)) {
this.privileges.splice(this.privileges.indexOf(privilege), 1);
} else {
this.privileges.push(privilege);
}
console.log(this.privileges);
}
}
我有以下 Angular5 服务:
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {MaintainableUser} from './maintain-users/maintainable-user';
import {Observable} from 'rxjs/Observable';
import {catchError} from 'rxjs/operators';
import {ApiErrorHandler} from '../api-error-handler';
@Injectable()
export class AdminService {
constructor(private http: HttpClient, private errors: ApiErrorHandler) {
}
getAllUsers(): Observable<MaintainableUser[]> {
return this.http.get<MaintainableUser[]>('api/admin/users').pipe(catchError(this.errors.handle));
}
}
这很好,很干净,现在我可以像这样使用我的服务了:
import {Component, OnInit} from '@angular/core';
import {MaintainableUser} from './maintainable-user';
import {AdminService} from '../admin.service';
@Component({
selector: 'app-maintain-users',
templateUrl: './maintain-users.component.html',
styleUrls: ['./maintain-users.component.scss']
})
export class MaintainUsersComponent implements OnInit {
constructor(private adminService: AdminService) {
}
ngOnInit() {
this.reloadMaintainableUsers();
}
private reloadMaintainableUsers() {
this.adminService.getAllMaintainableUsers().subscribe(
data => {
console.log(data);
console.log(data[0] instanceof MaintainableUser);
data[0].hasPrivilege('ADMIN');
},
err => {
console.log('Service error: ' + err);
}
);
}
}
问题是我收到的数据实际上不是MaintainableUser的列表。我的 MaintainableUsersComponent 的响应块具有以下输出:
{"id": "john", "name": "John Doe", "privileges": ["ADMIN"]}
假
ERROR TypeError: _v.context.$implicit.hasPrivilege 不是函数
这是为什么呢?为什么我的数据 [0] 不是可维护用户的实例?我对 Angular 很陌生,但我从不同的教程中了解到,从第 4 版开始,我应该能够像这样自动映射到我的类/接口。或者它只是一个假的东西,所以你可以确保你的对象是强类型的,但你不能确定它是实际对象本身的实例?如果我可以在我的响应类中有一些辅助方法,这样我就可以在视图中使用它们,这将是非常好的,但目前我还没有找到一个干净的方法来做到这一点。
【问题讨论】:
-
我不认为 StackOverflow 上的任何解决方案都是该问题的全面解决方案。所以,我为此创建了一个 npm 包 angular-http-deserializer:npmjs.com/package/angular-http-deserializer#usage
标签: angular typescript angular5 angular-httpclient