Javascript 角度2表单-当ngModel=空obj时禁用提交

Javascript 角度2表单-当ngModel=空obj时禁用提交,javascript,angular,typescript,angular2-ngmodel,Javascript,Angular,Typescript,Angular2 Ngmodel,我有一个Angular2表单,它是用for循环动态创建的。对于这个问题,我关心的是表单中的单选按钮。表单是在HTML中创建的,然后从TS I将每个输入的ngModel分配给一个空对象。我希望在选择单选按钮之前禁用表单中的“提交”按钮: <form (ngSubmit)="onNext(f)" #f="ngForm"> <div class="multi-choice-question-div radio-btn-div question_div" *ngIf="qu

我有一个Angular2表单,它是用for循环动态创建的。对于这个问题,我关心的是表单中的单选按钮。表单是在HTML中创建的,然后从TS I将每个输入的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>

{{answer?.value}

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


ngModel
=
{}

两种方式调用函数检查值是否为空(可能很昂贵,可能过于复杂)时,如何保持相同的设置(因为它深入到我的组件前端和后端),但使表单无效:

stringify和parse一起去掉所有未定义的键(继续,
console.log(formValue)
并查看那些未定义的键!)

或者,您可以检查表单中是否有
脏的
,这表明:

脏:布尔值如果用户更改了值,则控件为脏控件 在UI中

请注意,对控件值的编程更改不会标记它 肮脏的


Plunker演示:

谢谢。使用
f.dirty
效果很好,但我最终使用了一个函数,因为我有多个表单可以前后移动,当我返回到一个已填写的表单时,UI显示它已填写,但
f.dirty
显示它未被弄脏。我认为那个案子很具体。谢谢你的帮助
[disabled]="f.invalid || isEmpty(f.value)"

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