Отправить данные формы на основе выбранного пользователя в angular5 - PullRequest
0 голосов
/ 04 мая 2018

Я использую общую реактивную форму для нескольких типов пользовательских данных. Подобно тому, как некоторые пользователи имеют дополнительные данные, такие как учитель, ученик, охранник и т. Д. Форма выбрана из выпадающего списка

Я хочу отправить только определенный объект данных в соответствии с выбранным пользователем. Я создал модель с именем «пользователь», которая содержит все общие и разные поля. Теперь я хочу отправить данные, как показано ниже

 selectedUser:string; //form selected like teacher etc   
 submit(data){
   if(selectedUser === 'Teacher'){
     let techobj =new User(data.name,data.address,data.degree);
        this.userservice.post(url,teachobj);
        }
   if(selectedUser === 'Student'){
     let stuobj =new User(data.name,data.address,data.semester);
       this.userservice.post(url,stuobj);  
      }
    ..... so on
}

Модель класса

export class User{
    //all fields here

     constructor(name :string,address:string,semester ?:string ,degree?:string)
}

Задача не может перегрузить конструктор или создать объект с различными параметрами, такими как Java или C #

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете создать интерфейс с обязательными и необязательными свойствами, которые вам необходимо передать в особых случаях, как показано ниже

export interface IUser{
  name: string;
  address: string;
  semester?: string,
  degree?: string
}

Здесь имя, адрес обязательны для каждого случая, но семестр и степень могут быть переданы в зависимости от условия.

Вы можете использовать этот интерфейс в конструкторе вашего класса User, как показано ниже, чтобы установить значение свойств.

export class User{
    //all fields here
  public name: string;
  public address: string;
  public semester?: string;
  public degree?: string;

  constructor(user:IUser) {
    this.name = user.name;
    this.address = user.address;
    this.semester = user.semester;
    this.degree = user.degree;
  }

}

Наконец, вы можете создать экземпляр класса, как показано ниже -

let data2:IUser = { name: data.name, address: data.address, degree: data.degree};
let techobj = new User(data2);

ИЛИ вы можете сделать это так

let techobj2 = new User({ name: data.name, address: data.address, degree: data.degree});

Аналогично для Student вы можете создать экземпляр, подобный этому -

let techobj3 = new User({ name: data.name, address: data.address, semester:data.semester });

Вот полный код -

export interface IUser{
  name: string;
  address: string;
  semester?: string,
  degree?: string
}

 export class User{
    //all fields here
  public name: string;
  public address: string;
  public semester?: string;
  public degree?: string;

  constructor(user:IUser) {
    this.name = user.name;
    this.address = user.address;
    this.semester = user.semester;
    this.degree = user.degree;
  }

}

let data:IUser = { name: "Niladri", address: "123", degree: "GRAD" };
let techobj = new User(data);

///OR 
let techobj2 = new User({ name: "Niladri", address: "123", degree: "GRAD" });

//Similary 

let techobj3 = new User({ name: "Niladri", address: "123", semester:"6th" });

console.log(techobj2.degree); //GRAD
console.log(techobj3.semester); //6th

И ваш сервисный звонок должен быть таким -

selectedUser:string; //form selected like teacher etc   
 submit(data){
   if(selectedUser === 'Teacher'){
     let techobj =new User({ name: data.name, address: data.address, degree: data.degree});
        this.userservice.post(url,teachobj);
        }
   if(selectedUser === 'Student'){
     let stuobj =new User({ name: data.name, address: data.address, semester:data.semester });
       this.userservice.post(url,stuobj);  
      }
    ..... so on
}

P.S - если вы передадите null в вашем текущем конструкторе для нежелательных параметров, то это также будет работать

Редактировать 2: Другой подход заключается в создании базового класса User и наследовании от этого класса для создания Student и Teacher классов, а затем вызове super() в конструкторе дочерних классов для передачи name,address значение свойства для базового User класса. Но в этом случае будет много дочерних классов в зависимости от количества условий if

рабочая демоверсия:

Ссылка

0 голосов
/ 04 мая 2018

Возможно, стоит подумать о создании класса User, который содержит все поля, одинаковые для Учителя и Ученика. Затем вы можете создать отдельные классы для учителя и ученика, которые будут расширять класс пользователя и содержать другие уникальные для них поля, в данном случае степень для учителя и семестр для студента. Может быть, это поможет: Расширение классов в Typescript .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...