如何从角度7的API响应中制作动态表格?

时间:2019-04-18 06:57:55

标签: angular angular7 angular-reactive-forms dynamic-forms form-control

我正在使用角度7制作动态表格。我遵循了角度官方网站上提到的方法。我成功实现了该教程,但情况却有所不同。形式上会有什么样的输入,其所有属性都将来自API响应

这是服务中带给我数据的功能。 请注意:在API数据的基础上,我将填充问题数组,现在,我使用虚拟数据来确保流程正常运行。这就是我的question.service.ts看起来像

public response : QuestionBase<any>[] =[];      
getQuestions(id) {
  this.http.get(this.url+'selectAllFieldDetails/'+id)
.pipe(map(
( response: Response) => {
    let data = response;
    console.log(data);


   let questions: QuestionBase<any>[] = [

      new DropdownQuestion({
        key: 'brave',
        label: 'Bravery Ratings',
        class:'form-control fis-form-control',
        formclass:'',
        options: [
          {key: 'solid',  value: 'Solid'},
          {key: 'great',  value: 'Great'},
          {key: 'good',   value: 'Good'},
          {key: 'unproven', value: 'Unproven'}
        ],
        required: true,
        order: 2
      }),

      new TextboxQuestion({
        key: 'process',
        label: 'Process name',
        value: 'IT ',
        class:'form-control fis-form-control',
        formclass:'',
        required: true,
        order: 1
      }),


    ];
    this.response =  questions.sort((a, b) => a.order - b.order);
   }
  ));
  console.log(this.response);
  return this.response;
}

但是问题是函数在API响应之前返回,并且返回空数组。这就是我从create-ticket.component.ts

调用的方式
ngOnInit() {
  this.questions = this.service.getQuestions(24);
  console.log(this.questions);
}

我设法以某种方式首先获取API响应并将其存储在某个变量中,然后调用此函数this.service.getQuestions(24);。但随后显示错误

Error: Cannot find control with name: 'process'
at _throwError (forms.js:1775)
at setUpControl (forms.js:1683)
at FormGroupDirective.push../node_modules/@angular/forms/fesm5/forms.js.FormGroupDirective.addControl (forms.js:4532)
at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName._setUpControl (forms.js:5030)
at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName.ngOnChanges (forms.js:4980)
at checkAndUpdateDirectiveInline (core.js:9239)
at checkAndUpdateNodeInline (core.js:10507)
at checkAndUpdateNode (core.js:10469)
at debugCheckAndUpdateNode (core.js:11102)
at debugCheckDirectivesFn (core.js:11062)

和Formgorup数据保持为空。 请帮我解决这个问题。 预先感谢

2 个答案:

答案 0 :(得分:1)

因此,经过长时间的研发,我终于做到了。基本上有两个问题

  1. 服务功能先于API响应
  2. 在数据投入使用之前创建表格

因此,对于第一个问题,我使用了async await特征的概念

在create-ticket.component.ts中,我们添加了async并像这样等待。

async ngOnInit() {
    this.questions = await this.service.getQuestionss(24);
    if(this.questions.length>0){
       this.showForm=true;
    }
}

在服务中,我们返回承诺

async getQuestionss(id): Promise<any> {
     this.responses = await this.apiServce.getAllInputFields(id).toPromise();
}

它作为一个承诺来响应,因此它等待直到api响应。 this.apiservice.getAllInputFields(id)只是来自服务器的http api调用。

对于第二个问题,我只使用了一个小解决方案。我在表单中添加了* ngIf,因此当api用数据响应时,仅表单开始构建。

<app-dynamic-forms *ngIf="showForm" [questions]="questions"></app-dynamic-forms>

就这样,问题就解决了。

答案 1 :(得分:0)

基于stackblitz的过时信息

  

您应该始终订阅异步调用,以使其能够   被执行

ngOnInit() {
  this.questions = this.service.getQuestions(24).subscribe(result => {
                do something with result }, 
      err => { something went wrong });
}

根据您的情况,这是一次堆叠闪电战: https://stackblitz.com/edit/angular-h8zakj?embed=1&file=src/app/question.service.ts

正如我所说,您的setTimeout存在问题。无法在所需位置访问数据。