Angular - лучший подход для отправки частичной модели данных в HTTP-запрос - PullRequest
0 голосов
/ 07 июля 2019

Сервер возвращает объект User в ответе

{ 
  name: "some_name",
  age: 30
}

Я создам класс для объекта User, но у класса также есть другое свойство, которое мне нужно только на стороне клиента

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

свойство color, которое я буду использовать только на стороне клиента.

Теперь тип пользователя для клиента и сервера различен.

Если я хочу отправить User obj обратно на сервер безсвойство color, в методе запроса

  1. Должен ли я создать новый класс Object из User?
class UserRequest {
constructor(public name: string, public age: number) {}
}

let userRequest = new UserRequest(user.name, user.age);
Просто создать новый объект без типа?
let userRequest = {
  name: user.name,
  age: user.age
}

Здесь у меня есть только 2 свойства. Если у меня будет больше, будет ли это возможно?

Предположим, если мне нужно отправитьсписок User, затем итерация всех пользовательских объектов, создающих новый объект, увеличит сложность.

Каков наилучший подход, когда типы различаются?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019
this.http.post<ServerModel>({ serverModel.prop1: clientModel.prop1, serverModel.prop2: clientModel.prop2 });

Если вам нужно создать модель сервера в нескольких местах, вы можете включить ее в функцию.Видя, что вы используете классы, вы можете иметь метод toServerModel, но стандарт Angular должен использовать интерфейсы для моделей данных, а не классов.

0 голосов
/ 07 июля 2019

Вы можете определить новую функцию в вашем классе 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(), и он вернет объект только с name и age

Вы также можете сделать его более общим, определив 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.Если у вас есть массив пользователей, вы можете сопоставить его с массивом данных базы данных:

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