对模型驱动表单使用禁用

Posted

技术标签:

【中文标题】对模型驱动表单使用禁用【英文标题】:Use disable with model-driven form 【发布时间】:2017-02-02 13:09:05 【问题描述】:

我正在尝试在我的模型驱动表单中使用disabled。我有以下表格:

this.form = this.formBuilder.group(
    val1: ['', Validators.required],
    val2: [value:'', disabled:this.form.controls.val1.valid]
);

我收到错误消息(未找到 this.form 中的 controls)可能是因为我在 this.form 中使用了 this.form

我该如何解决这个问题?

PS 我也尝试在我的 html 中添加 [disabled]='...',但我收到警告说我应该改用 formBuilder

【问题讨论】:

嘿,不是应该是val1: fb.control('', Validators.required),而且你也必须更改 val 2 吗? @Ced 你可以读到这个:scotch.io/tutorials/… 它说了我的话。不知道我是否脱离了循环。检查我的答案,如果它完全不是你想要的,我会删除它 【参考方案1】:

是的,你是对的,问题是因为你引用了一个尚未启动的变量 (this.form)。幸运的是,在您的情况下,您实际上并不需要在 val2 表单控件中引用表单组。您的代码可以重写如下:

let val1Control = this.formBuilder.control('', Validators.required);
this.form = this.formBuilder.group(
    val1: val1Control ,
    val2: [value:'', disabled: val1Control.valid]
);

但是,此块仅启动 val2 控件的disabled 值,而不监控val1Control 的有效性。为此,您需要订阅val1Control.statusChanges

let val1Control = this.formBuilder.control('', Validators.required);
let val2Control = this.formBuilder.control(value:'', disabled: !val1Control.valid);
this.form = this.formBuilder.group(
  val1: val1Control,
  val2: val2Control
)

val1Control.statusChanges.subscribe((newStatus) => 
  if (val1Control.valid) 
    val2Control.enable();
   else 
    val2Control.disable();
  
);

这是工作的 plunker:http://plnkr.co/edit/kEoX2hN9UcY4yNS3B5NF

【讨论】:

哎呀,这太冗长了……我没想到disabled 这么复杂!无论如何,这是我认为最好的解决方案!谢谢 可爱!节省了我的时间。 帮了我很多忙,非常感谢!在我的情况下(如果你想禁用每个表单字段)this.form.disable(); 工作得很好! 这种情况下如何添加多个验证器?用逗号分隔还是在数组中?

以上是关于对模型驱动表单使用禁用的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2.0 中的模型驱动表单验证问题

struts2属性驱动模型

struts2 模型驱动封装

struts中的模型驱动(ModelDriven)的使用

Struts框架的数据封装二之模型驱动方式

typescript 在模型驱动的表单中启用子组件的验证