【发布时间】:2018-01-16 00:47:25
【问题描述】:
我正在创建一个动态创建的响应式表单。我以可观察的形式(来自主题)从服务获取数据,并希望在创建表单后订阅表单的valueChanges。当我第一次设置它时,我订阅了每个服务的 observables 和 valueChanges,但是我看到了表单创建的每一步的数据,这是有道理的,因为这两个服务 observables 可以在之后发出。
所以我重构了设置以使用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)}
随着类型字段的构建,它前面有十几个条目。
这应该是这样工作的吗?我的目标是在表单构建后订阅,所以我只在用户更改表单时获取值。
【问题讨论】:
-
您可以尝试在
afterViewInit生命周期内订阅 -
为什么是
afterViewInit?这与视图没有任何关系;在我订阅之前,订阅不应该给我价值吗? -
您在与
formBuilder相同的级别上运行订阅。这意味着您在 filterForm 初始化时订阅了它,并且可能在它完成构建之前订阅(因此订阅的值在开始时将为空)。由于正在构建的表单是构建视图的一部分,因此在视图初始化后订阅应该是安全的。希望这会有所帮助! -
我认为这意味着当我点击
addControl之类的方法时,不会立即构建表单?因为唯一有意义的方法是表单构建异步,允许订阅在表单初始化之前进行。我将移动代码以使其正常工作,但我仍然不明白它为什么会这样:/ -
正确,都是异步的
标签: angular rxjs angular-reactive-forms