我正在调用REST API并返回Observable<User[]>
,如下所示:
User.service.ts
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private httpClient:HttpClient) { }
getAllUsers():Observable<User[]>{
return this.httpClient.get<User[]>('https://jsonplaceholder.typicode.com/users');
}
}
在我的组件类中,我正在订阅并分配给实例变量:
UserComponent.ts
private users:User[];
constructor(private userService:UserService) { }
ngOnInit() {
this.userService.getAllUsers()
.subscribe(users => this.users = users)
}
我还创建了模型类User.ts
export class User{
constructor(
private _id:number,
private _username:string,
private _email:string,
private _phone:string
){}
get id():number{return this._id;}
set id(id:number){this._id = id;}
get username():string{return this._username;}
set username(username:string){this._username = username;}
get email():string{return this._email;}
set email(email:string){this._email = email;}
get phone():string{return this._phone;}
set phone(phone:string){this._phone = phone;}
}
以下是我的问题:
从服务中获取用户后,在this.users
方法内打印ngOnInit
时,我还将获得所有未映射在User.ts
类中的属性。例如:地址,网站等。
此行为是否正确,因为我得到打字机支持,因此只能调用组件内部模型类中定义的属性,但能够在打印时查看所有属性。
是否有一种方法只能从服务中获取属性,因为我的应用程序可能只希望从服务中获取数据的子集,而又不想将整个json数据加载到组件中?
这里有我想念的东西吗?
答案 0 :(得分:2)
是的,这是正确的行为。
在httpClient.get
方法上使用通用类型时,会将结果强制转换为该类型,而不是构造该类的实例。
就只剩下需要返回的字段而言,这取决于您要调用的API。
您的示例中使用的json占位符API不支持此功能。
如果您希望组件中的对象是Users
类的实例,则可以在分配它们时实例化该类:
ngOnInit() {
this.userService.getAllUsers()
.subscribe(users => this.users = users.map(user => new User(
user.id,
user.username,
user.email,
user.phone
)
))
}