我正在创建一个动态生成的响应式表单。我从一个Observable(来自Subject)的服务中获取数据,并想要在创建后订阅表单的valueChanges。当我第一次设置它时,我订阅了每个服务的可观察对象和valueChanges,但我看到表单创建的每个步骤的数据,这是有道理的,因为两个服务可观察对象可能会发出信号。
所以我重构了设置,使用Observable.zip,据我所知,使代码线性化,所以在到达valueChanges订阅之前应该设置好表单,但我仍然看到表单创建的每个步骤。
this.filterForm = this.formBuilder.group({
'search': '',
'types': this.formBuilder.group({}),
'dates': this.formBuilder.array([]),
});
let formData = Observable.zip(
this.eventService.getTypes(),
this.eventService.getDates()
);
formData.forEach(data => {
let types = data[0],
dates = data[1];
types.forEach(type => {
this.types.push(type);
(<FormGroup>(this.filterForm.get('types'))).addControl(type, new FormControl())
});
dates.forEach(date => {
this.dates.push(date.format('dddd'));
(<FormArray>(this.filterForm.get('dates'))).push(new FormControl(false))
});
this.filterForm.valueChanges.subscribe(data => console.log(data));
});
当我说我在构建表单时看到值,我是指这个:
{search: "", types: {…}, dates: Array(0)}
{search: "", types: {…}, dates: Array(1)}
{search: "", types: {…}, dates: Array(2)}
{search: "", types: {…}, dates: Array(3)}
{search: "", types: {…}, dates: Array(4)}
{search: "", types: {…}, dates: Array(5)}
在types字段构建之前有十几个条目。
这是正常的工作方式吗?我的目标是在表单构建之后订阅,以便只在用户更改表单时获取值。
afterViewInit
生命周期期间进行订阅。 - Z. BagleyafterViewInit
?这与视图还没有任何关系;在订阅之前,订阅不应该给我任何值吗? - RohitformBuilder
相同的级别上运行订阅。这意味着你正在订阅filterForm
,而此时它正在初始化过程中,很可能在构建完成之前(因此订阅的值将为空)。由于正在构建的表单是视图构建的一部分,因此在视图初始化后订阅应该是安全的。希望这可以帮助你! - Z. Bagley