Angular 为什么被动表单示例将数据传递给onvalueChanged,但不使用它

Angular 为什么被动表单示例将数据传递给onvalueChanged,但不使用它,angular,angular2-forms,Angular,Angular2 Forms,我正在学习ng2反应式表单的官方示例: 查看定义的方法:onValueChanged(数据?:any){ 数据可能被传递,但它从未在方法中使用 为什么要订阅上面的几行?=> this.heroForm.valueChanges .subscribe(data => this.onValueChanged(data)); 谁能给我解释一下这个奇怪的密码吗 ngOnInit(): void { this.buildForm(); } buildForm

我正在学习ng2反应式表单的官方示例:

查看定义的方法:onValueChanged(数据?:any){

数据可能被传递,但它从未在方法中使用

为什么要订阅上面的几行?=>

  this.heroForm.valueChanges
      .subscribe(data => this.onValueChanged(data));
谁能给我解释一下这个奇怪的密码吗

  ngOnInit(): void {
    this.buildForm();
  }

  buildForm(): void {
    this.heroForm = this.fb.group({
      'name': [this.hero.name, [
          Validators.required,
          Validators.minLength(4),
          Validators.maxLength(24),
          forbiddenNameValidator(/bob/i)
        ]
      ],
      'alterEgo': [this.hero.alterEgo],
      'power':    [this.hero.power, Validators.required]
    });

    this.heroForm.valueChanges
      .subscribe(data => this.onValueChanged(data));

    this.onValueChanged(); // (re)set validation messages now
  }


  onValueChanged(data?: any) {
    if (!this.heroForm) { return; }
    const form = this.heroForm;

    for (const field in this.formErrors) {
      // clear previous error message (if any)
      this.formErrors[field] = '';
      const control = form.get(field);

      if (control && control.dirty && !control.valid) {
        const messages = this.validationMessages[field];
        for (const key in control.errors) {
          this.formErrors[field] += messages[key] + ' ';
        }
      }
    }
  }

  formErrors = {
    'name': '',
    'power': ''
  };

  validationMessages = {
    'name': {
      'required':      'Name is required.XXX',
      'minlength':     'Name must be at least 4 characters long.',
      'maxlength':     'Name cannot be more than 24 characters long.',
      'forbiddenName': 'Someone named "Bob" cannot be a hero.'
    },
    'power': {
      'required': 'Power is required.'
    }
  };
}

也许作者想表明您可以订阅数据以使用它,但这并不是一个完全充实的示例


不要担心数据变量在本例中没有被使用,它只是一个示例。它背后没有其他含义,代码中的其他地方也没有副作用。

When-this.rentapartform.valueChanges.subscribe(data=>this.onValueChanged(data));被删除,代码示例将不再查找和显示validationMessages。确认了验证错误,但未显示任何消息。Typescript错误表示两个表达式中都必须有“data”才能匹配

但是这个代码示例中有一个错误。在下面的表达式中,-for(const key in control.errors),Typescript说“control.errors可能为null”

当代码中有此表达式时,页面将不会加载(使用Angular 4.4.3)出现一些关于“可能为空”的控制台错误。当注释掉时,页面将加载,但不显示validationMessages。在开发环境中,可以重新添加该行,一切正常,不显示控制台错误,并为用户显示validationMessages


有些事情搞砸了。有人知道需要做什么改变吗?

太无聊了……有人想无缘无故地结束这个合理的问题。。。