角度模型对象未正确映射

时间:2019-03-08 04:37:47

标签: angular typescript

我正在调用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;}
}

以下是我的问题:

  1. 从服务中获取用户后,在this.users方法内打印ngOnInit时,我还将获得所有未映射在User.ts类中的属性。例如:地址,网站等。

  2. 此行为是否正确,因为我得到打字机支持,因此只能调用组件内部模型类中定义的属性,但能够在打印时查看所有属性。

  3. 是否有一种方法只能从服务中获取属性,因为我的应用程序可能只希望从服务中获取数据的子集,而又不想将整个json数据加载到组件中? p>

这里有我想念的东西吗?

1 个答案:

答案 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
      )
    )) 
 }