如何在angular 4中以动态形式设置ngIf动态条件

Sur*_*h B 2 javascript angular angular4-forms

我正在创建一个动态表单,根据来自 JSON 之类的响应动态填充字段。

例如:-

[{
  "type":"text",
  "required":true,
  "minlength": 3,
  "maxlength":5,
  "name":"fname",
  "visibility":true
},
{
  "type":"text",
  "required":true,
  "minlength": 3,
  "maxlength":5,
  "name":"lname",
  "visibility":"fname == 'abc' || fname == 'xyz'"
},
{
  "type":"text",
  "required":true,
  "minlength": 3,
  "maxlength":5,
  "name":"fid",
  "visibility":true
},
{
  "type":"text",
  "required":true,
  "minlength": 3,
  "maxlength":5,
  "name":"lid",
  "visibility":"fid == 1 || fid == 4"
}]
Run Code Online (Sandbox Code Playgroud)

我有一个用例,只有当第一个字段的值应该为“abc”或“xyz”时,第二个字段才应该可见(条件写在 JSON 属性中)。如何动态实现?

Yer*_*kon 6

evaluation在组件中创建方法:

 isVisible(value){
    //console.log(eval(value));
    return eval(value); 
  }
Run Code Online (Sandbox Code Playgroud)

并在模板中调用它,如下所示:

<div *ngIf="isVisible(question.visibility)">
        <label [attr.for]="question.key">{{question.label}}</label>
        <div [ngSwitch]="question.controlType">
            <input [name]="question.key" *ngSwitchCase="'textbox'" [formControlName]="question.key" [id]="question.key" [type]="question.type">

            <select [id]="question.key" *ngSwitchCase="'dropdown'" [formControlName]="question.key">
      <option *ngFor="let opt of question.options" [value]="opt.key">{{opt.value}}</option>
    </select>
        </div>
        <div class="errorMessage" *ngIf="!isValid">{{question.label}} is required</div>
    </div>
Run Code Online (Sandbox Code Playgroud)

您的json文件将类似于:

 ...
 new TextboxQuestion({
        key: 'firstName',
        label: 'First name',
        value: 'Bombasto',
        required: true,
        order: 1, 
        visibility: 'true'
      }),

      new TextboxQuestion({
        key: 'emailAddress',
        label: 'Email',
        type: 'email',
        order: 2,
        visibility: 'this.form.get("firstName").value ==="abc"'
      })
Run Code Online (Sandbox Code Playgroud)

visibility: 'this.form.get("firstName").value ==="abc"',如您所见,您应该json像往常一样在组件类逻辑中写入,因为它将在组件上下文中运行

代码示例