【问题标题】:Angular / ionic: how to make a checkbox control invalid?Angular / ionic:如何使复选框控件无效?
【发布时间】:2017-10-27 07:42:46
【问题描述】:

如果复选框未选中,有什么简单的方法可以使 Angular 表单中的复选框控件无效?如果可能的话,我想用 HTML 来做。

这是我现在得到的:

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

  <!-- ... -->

  <ion-item>
    <ion-label>I accept terms</ion-label>
    <ion-checkbox name="termsAccepted"
                  [(ngModel)]="termsAccepted"
                  required>
    </ion-checkbox>
  </ion-item>
</form>

在这里,required 指令不起作用:一旦您选中复选框,它就被认为永远有效,即使您随后取消选中它(这实际上是 required 指令的正常行为)

我查看了there,但没有找到相关的指令。

我应该纠正自己的指令还是错过了更简单的方法?谢谢。

【问题讨论】:

  • 如果无效,你想怎么办?要显示消息吗?是否要禁用提交按钮?
  • @borislemke 我想禁用提交按钮(我有一个[disabled]="!f.valid"

标签: angular ionic-framework ionic2


【解决方案1】:

根据您的评论,您表示如果未选中提交按钮,您希望禁用它。而且您只想使用 HTML 来实现这一点,所以这就是我所拥有的:

<button [disabled]="!f.valid || !termsAccepted">submit</button>

请注意,您可以在模板中使用赋值运算符 &amp;&amp;|| 将起作用。 (你怎么称呼我可能是错误的)。

这更像是一个hackery,而不是使用它,您可能想要修复您构建表单的方式。您应该阅读ReactiveForms,相信我,这将为您节省很多未来的时间。

更新checkbox 元素没有required 状态。勾选与否均有效。您可能想要创建一个指令,例如 [mustBeChecked]

【讨论】:

  • 谢谢。从您的回答中,我了解到不可能使用“模板驱动”表单(使用 hacky 解决方案除外)来执行此操作,但可以使用“反应式”表单(我现在没有学习)。只有一个问题:为这个验证编写我自己的 Angular 指令可能是另一种解决方案?
  • 我刚刚在 plunker 上尝试了一些东西。我刚刚意识到,checkbox 真的没有required 状态。它的状态实际上是有效的,无论是否选中。您可能想要[mustBeTrue] 之类的东西,而不是通过检查它的值是否为真来验证。
  • [mustBeTrue] 是虚构属性,您可以自己创建它以使checkbox 元素无效。
  • 啊,我们忘记了一些事情。第一次加载页面时,控件有效但不应该有效。为了解决这个问题,我尝试在ngAfterViewInit() 方法上调用checkIfChecked() 方法,但出现错误:cat not read property setErrors of undefined
  • 您是否尝试将termsAccepted 的初始值设置为false?此外,您可能希望在 ngAfterViewInit 挂钩内进行检查。
【解决方案2】:

这里的复选框有点棘手。如果要将特定字段设置为无效,则需要进行一些修改。您可以添加一个更改事件,该事件将根据是否检查该字段手动将其设置为无效和有效,比方说一个名为checkIfChecked 的函数。您还需要使用 ViewChild 才能引用您的表单:

import { ViewChild, NgForm } from '@angular/core';

@ViewChild('f') f: NgForm;

checkIfChecked() {
  if (this.termsAccepted == false) {
    this.f.controls.termsAccepted.setErrors({notValid:true});
  }
  else {
    this.f.controls.termsAccepted.setErrors(null);
  }      
}

也许有更漂亮的方法,欢迎提出建议;)


不过,如果使用响应式表单,这一切都会变得容易得多,我参考 this answer.,您可以在其中执行以下操作:

this.myForm = builder.group({
    termsAccepted: [false, Validators.pattern('true')]
});

【讨论】:

  • 太好了,谢谢!我很快就会看看 Reactive 表单。两个问题:1)我用(click)="checkIfChecked()"它工作得很好,但也许它不是我应该使用的? - 2) termsAccepted 属性的类型应该是什么?再次感谢:)
  • 很高兴听到它成功了!是的,反应形式很好用,形式越大,反应形式越好。就个人而言,如果您没有大型表单,则反应式表单可能会过大。但这太主观了,所以你需要形成自己的观点,以及在你的情况下什么感觉最好。在这里,使用反应形式肯定会更容易,因此您根本不需要上面的功能:) 但至于您的问题:在这种情况下我会使用click,因为它确实是一个点击事件:) @ 987654329@ 变量应该是boolean
  • 感谢您的建议;)抱歉,我刚刚注意到第二个问题完全是假的哈哈。
  • 啊,我们忘记了一些事情。第一次加载页面时,控件有效但不应该有效。为了解决这个问题,我尝试在 ngAfterViewInit() 方法上调用 checkIfChecked() 方法,但出现错误:cat not read property setErrors of undefined
  • 如果复选框中有required 属性,似乎可以工作。此外,如果您没有将初始值设置为termsAccepted,而只是将其声明为termsAccepted: boolean。如果它设置了初始值,它似乎认为它是有效的。 plnkr.co/edit/1xwhtwB5YjKHDbRzusHP?p=preview
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2015-12-04
  • 2016-03-14
  • 2016-06-29
  • 2017-06-29
  • 2018-06-21
  • 2017-11-02
  • 2020-02-27
相关资源
最近更新 更多