Angular报TypeError: this.statutForm.value.poste.subscribe报错
问题场景
- 对应功能初始运行时完全正常,持续运行数分钟后突然失效
- 注释掉包含
subscribe的代码行后,LocalStorage读写功能可正常运行 - 已查阅过大量同类报错的公开讨论,但当前遇到的特殊场景没有匹配到现成解决方案,排查过程耗时较长,需要协助定位根因
- 关联的组件代码如下:
import { Component, OnInit } from '@angular/core'; import { StatutService } from '../statut.service'; import { Statut } from '../statut'; import { FormControl, FormGroup } from '@angular/forms'; import { Router } from '@angular/router'; @Component({ selector: 'app-accueil-admin', templateUrl: './accueil-admin.component.html', styleUrls: ['./accueil-admin.component.scss'] }) export class AccueilAdminComponent implements OnInit { statutForm!: FormGroup; constructor(private statutService: StatutService) { } ngOnInit(): void { this.statutForm = new FormGroup({ poste : new FormControl(''), etat : new FormControl(''), client : new FormControl(''), }); } recherche() { console.log('Statut saisi', this.statutForm.value); let poste = this.statutForm.value.poste; let etat = this.statutForm.value.etat; let client = this.statutForm.value.client; this.statutForm.value.poste.subscribe((data: Object) => { let keys = Object.keys(data); let values = Object.values(data); for (let i = 0; i < keys.length; i++) { if (keys[i] == 'poste') { poste = values[i]; } if (keys[i] == 'etat') { etat = values[i]; } if (keys[i] == 'client') { client = values[i]; } } let leStatut = new Statut(poste, etat, client); this.statutService.addStatut(leStatut); }); } }
核心逻辑异常点
this.statutForm.value是Angular表单生成的纯普通对象,仅存储各控件的当前值,不属于可观察对象,本身不具备subscribe方法,直接调用会触发运行时异常- 原本想要监听表单值变化的逻辑存在书写偏差:正确的表单值监听入口是
this.statutForm.valueChanges,当前代码错将静态的表单值对象当作可观察流来订阅 - 每次触发
recherche()方法都会重复注册无效订阅,长期运行后累积的内存占用、无效事件回调会逐步影响应用运行状态,和“初始功能正常、数分钟后突然失效”的现象完全匹配
内容的提问来源于stack exchange,提问作者Derkou
相关产品推荐
相关产品推荐

