javascript - Angular 2动态表单如何根据另一个字段的值显示/隐藏一个字段

标签 javascript validation angular typescript forms

环境:Angular 2 RC 4, typescript 。

我有一个 Dynamic Angular forms 的实现.我总共有 4 个字段 - 出生日期、电子邮件、问题和答案

问题:

dob: new TextboxQuestion({
      key: 'dob',
      label: 'Date of Birth',
      value: '',
    }),


    email: new TextboxQuestion({
      key: 'email',
      label: 'Email Address',
      value: '',
      type: 'email',
    }),

    securityQuestion: new TextboxQuestion({
      key: 'challengeQuestion',
      label: 'Security Question',
      value: '',
      disabled: true
    }),
    securityAnswer: new TextboxQuestion({
      key: 'challengeAnswer',
      label: 'Write your answer',
      value: '',
    })

主要/父组件的html片段

<dynamic-form (responsesEvt)="onFormSubmitResponseReceived($event);" [sections]="sections" class="col-md-8"></dynamic-form> 

动态表单组件

<form (ngSubmit)="onSubmit()" [formGroup]="form"> 
            <div *ngFor="let question of questions" class="form-row" >
                <df-question [question]="question" [form]="form" *ngIf="!section.hidden"></df-question>
            </div>

        <div class="row">
            <div class="col-md-5"></div>
            <div class="col-md-7 btn-row">
                <button type="submit" class="btn btn-primary pull-right" [disabled]="!form.valid">I agree with the Terms & Conditions</button>
                <!--<button type="submit" class="btn btn-primary pull-right" [disabled]="!form.valid || subbmittedalready">I agree with the Terms & Conditions</button>-->
                <button type="button" class="btn btn-default pull-right">Cancel</button>
            </div>
        </div>
    </form>

df-问题组件

<div [formGroup]="form">
  <div class="col-md-5"><label class="pull-right" [attr.for]="question.key"><span class="errorMessage">*&nbsp;</span>{{question.label}}</label></div>
  <div class="col-md-7" [ngSwitch]="question.controlType">
    <input *ngSwitchCase="'textbox'" [formControlName]="question.key" [id]="question.key" [type]="question.type" class="form-control"
      [placeholder]="question.placeHolder"
       />
  </div>
  <div class="col-md-5"></div>
</div>  

这是我的工作流程

Step 1 Initially at form load, only dob and email show up.
Step 2 User types in the dob and email. DOB and email are sent to the backend and if the info is correct, a "question" is returned.
Step 3 Now the question and answer fields appear (assuming that above step was successful). The question field is populated with the value returned from the server through the previous request
Step 4 User submits the form with dob, email, question and answer

关于如何使用动态表单实现这一点有什么想法吗?

我想我可以 在 dob 之后以某种方式抛出一个事件,电子邮件已填满,调用后端并获取问题。 根据上述响应的成功/失败使用变量来隐藏/显示问题和答案?

如果这是一个好方法,我怎么能感觉到用户已经填写了前两个字段并进行后端调用。收到服务器响应后如何更新问题字段(特别是使用动态表单)?

如果没有,是否有更简单的方法来做到这一点?

最佳答案

我知道这是一个延迟的答案,但我认为本质上是 this Scotch.io post涵盖了您需要做的事情的基础知识。

您创建一个表单组并根据字段值换出验证,然后在 View 中使用 ngIfs 隐藏您禁用的字段。

关于javascript - Angular 2动态表单如何根据另一个字段的值显示/隐藏一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927988/

相关文章:

javascript - 摆脱选择标签中的空白条目

javascript - 动态调整 Bootstrap 布局

jquery - MVC3 正则表达式验证器 - "Syntax Error In Regular Expression"

Angular2,调用服务函数,无法读取未定义的属性 '***'

jquery - Ionic 2 图像弹出窗口(Angular 2 动态绑定(bind))

javascript - Knockout 检查的属性不能按预期工作

javascript - 如何正确安装/访问 Javascript 库

javascript - Javascript 中的年份验证

validation - CakePHP isUnique 在用户编辑期间进行验证

Angular 2如何让setter等待输入setter完成