Angular4中如何初始化表单组?
How to initialize form group in Angular 4?
我有以下 ngOnInit 方法:
ngOnInit() {
this.countries = this.sharedService.getCountries();
this.shopService.getCurrentShopFromCache().then(shop => {
this.shop = shop;
this.myFormGroup = this.fb.group({
name: [this.shop.name[this.shop.defaultLanguage.code], [Validators.required]],
address: [this.shop.address.address],
city: [this.shop.address.city],
state: [this.shop.address.state],
country: [this.shop.address.country, [Validators.required]],
phone: [this.shop.phone],
email: [this.shop.email],
website: [this.shop.social.website],
twitter: [this.shop.social.twitter],
facebook: [this.shop.social.facebook],
instagram: [this.shop.social.instagram],
foursquare: [this.shop.social.foursquare]
});
}
);
}
我正在
formGroup expects a FormGroup instance. Please pass one in.
我哪里错了?
更新:
<form *ngIf="shop" class="m-form m-form--fit m-form--label-align-right" [formGroup]="myFormGroup" novalidate>
...
您必须在组件创建时立即实例化 formgroup,即在构造函数中,否则 angular 将无法找到将模板属性绑定到的对象。
更新
改写:您必须在 angular 呈现模板之前实例化表单组。它比 angular 1.x 更严格,如果它无法在 html 表单呈现时评估模板绑定中的表达式,则会抛出错误。
因为你在模板中使用 *ngIf="shop"
我会说这意味着 shop
不为空 before then() 被执行 -也许最初,也许是通过其他一些功能 - 它不在您提供的代码中,所以我无法指出。
您要做的是使用某些服务获取的一些数据来初始化表单。这完全没问题 - 但仍然没有理由推迟 创建 控件。只需在构造函数中创建它们,然后使用 FormGroup's setValue(), patchValue() or reset() 在 ngOnInit 中设置值——具体取决于您的需要。以下只是想法,您需要根据自己的表单结构对其进行调整。
app.component.ts
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
formGroup: FormGroup;
constructor(fb: FormBuilder) {
this.formGroup = fb.group({
title: fb.control('initial value', Validators.required)
});
}
ngOnInit(): void {
this.formGroup.reset({title: 'new value'});
}
}
app.component.html
<form [formGroup]="formGroup">
<input type="text" formControlName="title">
</form>
我有以下 ngOnInit 方法:
ngOnInit() {
this.countries = this.sharedService.getCountries();
this.shopService.getCurrentShopFromCache().then(shop => {
this.shop = shop;
this.myFormGroup = this.fb.group({
name: [this.shop.name[this.shop.defaultLanguage.code], [Validators.required]],
address: [this.shop.address.address],
city: [this.shop.address.city],
state: [this.shop.address.state],
country: [this.shop.address.country, [Validators.required]],
phone: [this.shop.phone],
email: [this.shop.email],
website: [this.shop.social.website],
twitter: [this.shop.social.twitter],
facebook: [this.shop.social.facebook],
instagram: [this.shop.social.instagram],
foursquare: [this.shop.social.foursquare]
});
}
);
}
我正在
formGroup expects a FormGroup instance. Please pass one in.
我哪里错了?
更新:
<form *ngIf="shop" class="m-form m-form--fit m-form--label-align-right" [formGroup]="myFormGroup" novalidate>
...
您必须在组件创建时立即实例化 formgroup,即在构造函数中,否则 angular 将无法找到将模板属性绑定到的对象。
更新
改写:您必须在 angular 呈现模板之前实例化表单组。它比 angular 1.x 更严格,如果它无法在 html 表单呈现时评估模板绑定中的表达式,则会抛出错误。
因为你在模板中使用 *ngIf="shop"
我会说这意味着 shop
不为空 before then() 被执行 -也许最初,也许是通过其他一些功能 - 它不在您提供的代码中,所以我无法指出。
您要做的是使用某些服务获取的一些数据来初始化表单。这完全没问题 - 但仍然没有理由推迟 创建 控件。只需在构造函数中创建它们,然后使用 FormGroup's setValue(), patchValue() or reset() 在 ngOnInit 中设置值——具体取决于您的需要。以下只是想法,您需要根据自己的表单结构对其进行调整。
app.component.ts
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
formGroup: FormGroup;
constructor(fb: FormBuilder) {
this.formGroup = fb.group({
title: fb.control('initial value', Validators.required)
});
}
ngOnInit(): void {
this.formGroup.reset({title: 'new value'});
}
}
app.component.html
<form [formGroup]="formGroup">
<input type="text" formControlName="title">
</form>