【问题标题】:Angular 2 Form - disable submit when ngModel = empty objAngular 2 Form - 当ngModel =空obj时禁用提交
【发布时间】:2016-12-12 19:34:11
【问题描述】:

我有一个使用 for 循环动态创建的 Angular2 表单。对于这个问题,我关心表单中的单选按钮。表单是在 HTML 中创建的,然后从 TS 我将每个输入的 ngModel 分配给一个空对象。我希望在选择单选按钮之前禁用表单中的提交按钮:

<form (ngSubmit)="onNext(f)" #f="ngForm">

<div class="multi-choice-question-div radio-btn-div question_div" 
    *ngIf="question?.type === 'multi-choice' && !question?.isYesOrNo">
    <div *ngFor="let answer of question?.answerDetails">
        <input
            type="radio" 
            class="display-none" 
            id="{{ answer?.answerId }}"
            [(ngModel)]="ngModelObj['question_' + question.questionId]"
            name="answerForQustion{{ question?.questionId }}"
            [value]="answer"
            required>
        <label class="col-md-12 col-sm-12 multi-choice-label" for="{{ answer?.answerId }}">
            <p class="q-text">{{ answer?.value }}</p>
        </label>
    </div>
</div>

<button class="btn btn-next"
    type="submit"
    *ngIf="currentSectionIndex < sectionsArr.length - 1"
    [disabled]="!f.valid">
        NEXT
</button>

</form>

即使客户端没有选择单选按钮,表单也认为它是有效的,我认为这是因为单选输入的 ngModel 设置为 = 为 {}

我怎样才能保持相同的设置(因为它深深地嵌入到我的组件前端和后端中)但是当ngModel = {} 时使表单无效

【问题讨论】:

    标签: javascript angular typescript angular2-ngmodel


    【解决方案1】:

    两种方式,调用函数检查值是否为空(可能很昂贵,可能过于复杂):

    [disabled]="f.invalid || isEmpty(f.value)"
    
    isEmpty(formValue) {
      let x = JSON.parse(JSON.stringify(formValue));
      return Object.getOwnPropertyNames(x).length === 0;
    }
    

    字符串化和解析一起去除任何未定义的键(继续,console.log(formValue) 并查看那些未定义的键!)

    或者您可以查看dirty 的表格,这表明:

    dirty : boolean 如果用户更改了值,则控件是脏的 在用户界面中。

    请注意,对控件值的编程更改不会对其进行标记 脏。

    [disabled]="!f.valid || !f.dirty"
    

    https://angular.io/docs/ts/latest/api/forms/index/AbstractControl-class.html#!#dirty-anchor

    Plunker 演示:http://plnkr.co/edit/14yQk2QKgBFGLMBJYFgf?p=preview

    【讨论】:

    • 谢谢。使用f.dirty 效果很好,但我最终使用了一个函数,因为我有多个表单可以前后移动,当我回到已填写的表单时,UI 将其显示为已填写,但 @987654328 @ 显示它不脏。我认为这个案例非常具体。感谢帮助
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多