angular - 简单的 Angular2 Reactive Form 控件启用状态更改

标签 angular rxjs reactive-programming observable

我有一个表格 first_namelast_name字段。

当这两个字段都输入了值时,我希望在同一表单中启用另一个 formControl。

我知道我可以像这样订阅更改:

  createForm() {
    this.myForm = new FormGroup({
      first_name: this.first_name,
      last_name: this.last_name,
      email: this.email,
      mobile: this.mobile,
      salutation: this.salutation
    });
    this.myForm.valueChanges.subscribe(data => console.log('form changes', (!data.first_name == !data.last_name)));
  }

当两个值都设置时,它会记录到控制台并显示“true”。

this thread可以看出在 Angular github 上,我们不能/不应该将其设置为属性并绑定(bind) [disabled]=<booleanProperty> (核心团队似乎仍在处理这个问题)。

那么我如何使用上面的 valueChanges 流的结果将另一个控件实际设置为启用状态?

在 OnInit 中,它根据指南被禁用:

this.salutation = new FormControl({value:'', disabled: true}, Validators.required); 

更新

抱歉,我忘了说我已经在 OnInit 中尝试过了:

this.myForm.valueChanges.subscribe(data => {
  if (!data.first_name == !data.last_name) {
    this.salutation.enable();
  };
}) 

这不起作用,它会抛出控制台错误:Maximum call stack size exceeded

最佳答案

超出的堆栈大小是解决此问题的线索。由于流是“连续的”,我的代码一直将控件设置为启用 - 当然,它只需要启用一次。

所以添加一个检查解决了这个问题,现在它起作用了:

this.myForm.valueChanges.subscribe(data => {
  if (!data.first_name == !data.last_name && this.myForm.controls['salutation'].disabled) {
    this.myForm.controls['salutation'].enable();
  };
}) 

更多信息 here

关于angular - 简单的 Angular2 Reactive Form 控件启用状态更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228320/

相关文章:

jquery - 在 Angular 项目中添加 jQuery DateTimePicker (非官方)后出现 jQuery 的引用错误

node.js - rxjs 在错误发生后立即完成可观察的操作而不是继续

rxjs - switchMap里面的动态数组CombineLatest是不断退订再订阅

javascript - rxjs 限制获取直到请求完成

system.reactive - Rx 自动分离行为,它有什么用?它是如何工作的?

angular - 使用 Angular-cli 在 Angular2 中进行本地化

javascript - map 方法中的散布算子复制对象时的使用方法

javascript - Angular 7 - 上传多个文件以及数据和报告进度

javascript - 如何使用 React 创建 “twitter like” 剩余字符数

spring - 如何将 Mono<String> 转换为 Mono<MyObject>?