Привязка данных JSON к реактивной форме

Я наткнулся на следующую демонстрацию Stackblitz:

https://stackblitz.com/edit/angular-dffny7?file=app

со ссылкой на следующий пост: /questions/28127959/uglovyie-reaktivnyie-formyi-s-vlozhennyimi-massivami-form/28127969#28127969

Теперь предположим, что у меня есть следующий JSON

{
 "companies": [
  {
   "company": "ABC",
   "projects": [
     {
     "projectName": "DEF"
     },
     {
     "projectName": "GHI"
     }
    ]
   },
   {
    "company": "JKL",
    "projects": [
     {
     "projectName": "MNO"
     }
   ]
  }
 ]
}

исходя из следующего сервиса:

getCompanies() : Observable<Organization>{
return this.http.get(url).map((response: Response)=> response.json())}

и класс организации выглядит следующим образом:

export class Organization{
public company: String;
public projects : Project[];
}
export class Project{
public projectName : String;
}

У меня есть вышеупомянутые данные JSON в объекте класса Organization в моем файле компонента, и я хочу отобразить эти данные в полях формы в файле html. Я пытался связать данные с помощью ngModel, но где-то читал, что ngModel нельзя использовать в модельно-ориентированной форме. Как мне этого добиться?

1 ответ

@ Случайный парень, ключ для передачи данных из json в FormBuilder использует метод "map" для массивов. Но сначала, пожалуйста, используйте HttpClient, а НЕ старый и устаревший http (поэтому вам не нужно использовать эту уродливую карту ((response: Response)=> response.json())}

Ну, вы импортируете в конструктор форму Builder

constructor (private fb:FormBuilder){}

И сделайте функцию, которая получает в качестве аргумента ваш json или null и возвращает fromGroup

  createForm(data: any): FormGroup {
    return this.fb.group({
      //id data.companies, we create a formArray
      companies: data ? this.fb.array(this.createGroupProjects(data.companies)) : []
    })
  }
  //return an array of FormGroups
  createGroupProjects(companies: any[]): FormGroup[] {
    //with each element in companies
    return companies.map(c => {
      //create a formGroup
      return this.fb.group({
        company: c.company,
        //projects will be a form array too
        projects: this.fb.array(this.createProjects(c.projects))
      })
    })
  }
  //return an array of FormGroups
  createProjects(projects: any[]): FormGroup[] {
    //with each project
    return projects.map(p => {
      //return a FormGroup
      return this.fb.group({
        projectName: p.projectName
      })
    })
  }

Конечно, вы можете использовать только функцию

  createForm(data: any): FormGroup {
    return this.fb.group({
      //in "companies" if data.companies, we return a FormArray
      //with each element of data.companies we return a formGroup
      companies: data ? this.fb.array(data.companies.map(c => {
        return this.fb.group({
          company: c.company,
          //the propertie projects will be another FormArray
          //with each element in projects
          projects: this.fb.array(c.projects.map(p => {
            //return a formGroup
            return this.fb.group({
              projectName: p.projectName
            })
          }))
        })
      }))
        //If data=null, you return an array
        : []
    })
  }

Убедитесь, что ваш FormArray создан с использованием this.bt.array(... массив formGroup...), а этот formGroupArray создан с использованием "map".

Другие вопросы по тегам