我们在工作中遇到了很多关于表单和嵌套表单的问题。
在围绕该主题进行了大量研究以简化我们的生活之后,我们提出了一个我们决定开源的库。它是一个超小型的包装器,可用于响应式或模板表单(不过肯定会推荐响应式)。
这个库被称为 ngx-sub-form:https://github.com/cloudnc/ngx-sub-form
自述文件应包含您发现该库所需的所有内容,但我还在这里写了一篇文章:https://dev.to/maxime1992/building-scalable-robust-and-type-safe-forms-with-angular-3nf9 以了解更多详细信息。
现在,我已将您的 stackblitz 转换为使用 ngx-sub-form,如下所示:
https://stackblitz.com/edit/user-nested-form-group?file=src/app/app.component.ts
代码:
app.component.ts
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
public userUpdate(user: User): void {
// every time the form changes
// this method will be called
console.log(user);
}
}
app.component.html
<app-user-form (userUpdate)="userUpdate($event)"></app-user-form>
user-form.component.ts
@Component({
selector: "app-user-form",
templateUrl: "./user-form.component.html",
styleUrls: ["./user-form.component.css"]
})
export class UserFormComponent extends NgxAutomaticRootFormComponent<User> {
@DataInput()
@Input("user")
public dataInput: Required<User>;
@Output("userUpdate")
public dataOutput: EventEmitter<User> = new EventEmitter();
protected getFormControls(): Controls<User> {
return {
name: new FormControl(null),
address: new FormControl(null),
};
}
}
user-form.component.html
<div [formGroup]="formGroup">
<input type="text" [formControlName]="formControlNames.name" placeholder="Name">
<app-address-control type="text" [formControlName]="formControlNames.address" placeholder="Address"></app-address-control>
</div>
<pre>{{ formGroupValues | json}}</pre>
<!-- So you can simply do: -->
<ul>
<li>Name: {{ formGroupValues.name }}</li>
<li>
Address
<ul>
<li>Country: {{ formGroupValues.address.country }}</li>
<li>State: {{ formGroupValues.address.state }}</li>
</ul>
</li>
</ul>
在上面,请注意访问嵌套值是多么容易
address-control.component.ts
@Component({
selector: "app-address-control",
templateUrl: "./address-control.component.html",
styleUrls: ["./address-control.component.css"],
providers: subformComponentProviders(AddressControlComponent)
})
export class AddressControlComponent extends NgxSubFormComponent<
Address
> {
protected getFormControls(): Controls<Address> {
return {
country: new FormControl(null),
state: new FormControl(null)
};
}
}
address-control.component.html
<div [formGroup]="formGroup">
<input type="text" [formControlName]="formControlNames.country" placeholder="Country">
<input type="text" [formControlName]="formControlNames.state" placeholder="State">
</div>
这里不是解释库的所有特性的地方,所以我会让你深入阅读自述文件或文章,但这样做你在使用 AoT 和更多东西时也会获得额外的类型安全性。
查看演示时,还请打开控制台,看看您可以在表单更改时轻松做出反应。