Angular-在HTTP请求中发送部分数据模型的最佳方法

时间:2019-07-07 16:16:14

标签: javascript angular typescript casting typescript-typings

服务器返回一个User对象作为响应

{ 
  name: "some_name",
  age: 30
}

我将为User对象创建一个类,但是该类还具有我仅在客户端需要的其他属性

class User {
  public color: string = "red"
  constructor(public name: string, public age: number) {}
}

我只能在客户端使用的颜色属性。

现在,客户端和服务器的用户类型不同。

如果我想将不带color属性的User obj发送回服务器,请使用请求方法

  1. 我应该从User创建一个新的类Object吗?
class UserRequest {
constructor(public name: string, public age: number) {}
}

let userRequest = new UserRequest(user.name, user.age);
  1. 只创建没有类型的新对象吗?
let userRequest = {
  name: user.name,
  age: user.age
}

这里我只有2处房产,如果我拥有更多,那这可行吗?

假设如果我必须发送一个User列表,则迭代所有用户对象以创建一个新对象会增加复杂性。

类型不同时最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以在User类中定义一个新函数,该函数将仅返回数据库字段,或者通过定义一个dbFields数组(仅包含需要发送到的字段)使其更通用。服务器:

class User {
  public color: string = "red";
  private dbFields = ['name', 'age'];
  constructor(public name: string, public age: number) {}

  getUserData(){
    let data = {};
    for(const field of this.dbFields)
      data[field]=this[field];
    return data;
  }
}

然后,您可以简单地调用user.getUserData(),它将返回仅包含nameage的对象

您还可以通过定义Model类使其更通用,并在其他模型中使用该函数:

class Model {
  constructor(protected dbFields: string[]) {}

  getDatabaseData(){
    let data = {};
    for(const field of this.dbFields)
      data[field]=this[field];
    return data;
  }
}

class User extends Model {
  public color: string = "red";
  constructor(public name: string, public age: number) {
    super(['name', 'age']);
  }
}

当您要发送请求时,您致电user.getDatabaseData()

如果有更多字段,只需将更多值添加到dbFields数组中。如果您有一组用户,则可以map将其存储到一组数据库数据中:

const usersData = users.map((user: User)=>user.getDatabaseData());

答案 1 :(得分:0)

this.http.post<ServerModel>({ serverModel.prop1: clientModel.prop1, serverModel.prop2: clientModel.prop2 });

如果需要在多个位置创建服务器模型,可以将其包装在一个函数中。看到您正在使用类,您可以有一个名为toServerModel的方法,但是Angular标准是对数据模型而不是对类使用接口。

相关问题