使用angular 2 [formControl]

时间:2016-11-18 05:50:40

标签: javascript html validation angular typescript

我有一个有角度的表单,并使用*ngFor重复输入框。此外,我必须动态验证由*ngFor生成的所有输入框。

有一个名为list的JSON数组,其中包含Questions。我必须生成答案的输入框,并且应该验证它们。验证信息也在列表中。

这是列表的一个例子

[{id:1,
mandatory:false,
questionDescription:"Blue flags are in position and contain words “Stop, Tank Car Connected” or “Stop, Men at Work”",
questionType:1,
validation:{maximum:100,minimum:0}},
{id:2,
mandatory:true,
questionDescription:"Wheels are chocked and handbrake(s) set” or “Stop, Men at Work",
questionType:2,
validation:{maxLength:10,minLength:3}}]

我尝试验证生成的输入框,如此处所述。 https://scotch.io/tutorials/angular-2-form-validation(参见那里的验证表格)。

所以我必须为每个输入框提供验证信息,如下所示。 (来自给定教程的这个例子)

constructor(fb: FormBuilder){
    this.complexForm = fb.group({
      'firstName' : [null, Validators.required],
      'lastName': [null, Validators.compose([Validators.required, Validators.minLength(5), Validators.maxLength(10)])]
    })

这是它的HTML。

      <div class="form-group">
        <label>First Name:</label>
        <input class="form-control" type="text"[formControl]="complexForm.controls['firstName']">
      </div>
      <div class="form-group" >
        <label>Last Name</label>
        <input class="form-control" type="text" [formControl]="complexForm.controls['lastName']">
      </div>

所以在我的情况下,所有输入框都按*ngFor生成,我必须动态地为这些框分配firstNamelastName等标签。 所以我使用question.id作为标记并实现了控制组。

inspectionForm: FormGroup;

  constructor(fb: FormBuilder) {

    this.questionTemplate = templateService.getQuestionTemplate();

    let objString: string = "{";

    for (let item of this.questionTemplate.sectionList[0].questionList) {
      if (item.questionType == 2) {
        objString += '"' + item.id + '":null,';
      }
    }

    objString = objString.slice(0, -1);
    objString += '}';
    let objJson = JSON.parse(objString);

    for (let item of this.questionTemplate.sectionList[0].questionList) {
      if (item.questionType == 2) {
        objJson[item.id] = [null,Validators.compose([Validators.minLength(item.validation.minLength), Validators.maxLength(item.validation.maxLength)])];
      }
    }
    this.inspectionForm = fb.group(objJson);
}

这是我的HTML代码。

    <form [formGroup]="inspectionForm" (ngSubmit)="submitForm(inspectionForm.value)">

            <div *ngFor="let question of section.questionList" [ngSwitch]="question.questionType">
              <ion-row *ngSwitchCase="QuestionType.String">
                <ion-col width-80>{{question.questionDescription}}</ion-col>
                <ion-col width-20>
                  <ion-input id="{{question.id}}" type="text" class="inspection-bottom-border" [formControl]="inspectionForm.controls['{{question.id}}']"></ion-input>
                </ion-col>
              </ion-row>
            </div>

            <div class="form-group">
              <button type="submit" class="btn btn-primary" [disabled]="!inspectionForm.valid">Submit</button>
            </div>

   </form>

问题是......

如果我将[formControl]定义为[formControl]="inspectionForm.controls['{{question.id}}']"

我收到如下错误,

unhandled Promise rejection: Template parse errors:
Parser Error: Got interpolation ({{}}) where expression was expected at column 25 in [inspectionForm.controls['{{question.id}}']] in InspectionPage@36:91 ("idth-20>
              <ion-input id="{{question.id}}" type="text" class="inspection-bottom-border" [ERROR ->][formControl]="inspectionForm.controls['{{question.id}}']"></ion-input>

然后我在StackOverflow中搜索了一个答案,我发现有人说过一次不使用[]{{}}Dynamic routerLink value from ngFor item giving error "Got interpolation ({{}}) where expression was expected"

但如果我删除[]并定义如下

formControl="inspectionForm.controls['{{question.id}}']"

我收到如下错误

EXCEPTION: Error in ./InspectionPage class InspectionPage - inline template:36:91 caused by: Cannot create property 'validator' on string 'inspectionForm.controls['2']'

(这个'2'是第一类2问题的问题。)

如果我定义如下相同的错误

formControl="inspectionForm.controls['2']"

但问题是如果我用[formControl]

定义如下
[formControl]="inspectionForm.controls['2']"

该应用正常运作....

但我必须动态地给予question.id。我怎么能这样做?

是否有人有此错误的解决方案。请提出建议。

非常感谢。

1 个答案:

答案 0 :(得分:1)

只需使用[formControl]="inspectionForm.controls[question.id]"

感谢@Sasxa的回答