angular - 重用整个表单,而不仅仅是其中的一部分
问题描述
我希望能够多次重复使用整个表单(反应式表单)。我在网上寻找答案,但只找到了重用部分表单然后将其包含在父表单中的方法(Address
例如)。
这就是我想做的事情:我有一个模型,比方说User
。UserComponent
所以我用子组件创建了一个:
UserListComponent
(包含所有用户表的页面)UserCreateComponent
(带有创建新用户的表单的页面+背后的逻辑)UserDetailsComponent
(有关所选用户详细信息的页面)UserUpdateComponent
(带有更新现有用户的表单的页面+背后的逻辑)
所以我想知道,有没有一种方法可以创建例如UserFormComponent
并以某种方式在两者中使用它UserCreateComponent
,UserUpdateComponent
这样我就不需要编写该模板+逻辑两次?此外,有没有办法在父组件中处理创建/更新逻辑而不是表单组件。例如service.create()
会被调用UserCreateComponent
并且service.update()
会被调用UserUpdateComponent
。
另外,请让我知道我是否完全错误地解决了这个问题,或者是否有更好的方法来做到这一点。我是 Angular 2+ 的新手,所以我还在想办法。
谢谢
解决方案
这是一个建议。使用一个通用组件来创建和更新,而无需使用两个单独的组件作为UserCreateComponent
和UserUpdateComponent
。
假设通用组件是UserUpsertComponent
. 要确定组件是用于呈现用户创建属性还是用户编辑属性,请使用简单的 boolean isEdit
。您可以将其用作输入。
<app-user-upsert-component
[isEdit]="true when your editing the user"
[userData]="null when creating a user">
</app-user-upsert-component>
在大多数情况下,您将导航到UserUpsertComponent
from uUserListComponent
。因此,您可以确定您是来创建用户还是使用路由参数编辑用户。根据路由参数,您可以设置为isEdit
真或假。
import { Component, Input } from "@angular/core";
import { FormBuilder, Validators, FormGroup } from "@angular/forms";
import { UserService } from 'path/to/your/service';
import { UserData } from '../models';
@Component({
selector: 'app-user-upsert-component',
styleUrls: ['./app-user-upsert-component.scss'],
templateUrl: './app-user-upsert-component.html'
})
export class UserUpsertComponent {
@Input()
public isEdit: boolean;
@Input()
public userData: UserData;
private form:FormGroup;
constructor(private fb: FormBuilder, private userService: UserService) { }
public ngOnInit(): void {
this.initFormGroup();
}
public onFormSubmit(): void {
const value = this.form.value;
if (!this.isEdit) {
this.userService.createUser(value);
} else {
this.userService.updateUser(value);
}
}
private initFormGroup(): void {
if (!this.isEdit) {
this.form = this.fb.group({
name: [null, Validators.required],
age: [null, Validators.required]
});
} else {
this.form = this.fb.group({
name: [this.userData.name, Validators.required], //userData is a component input
age: [this.userData.age, Validators.required]
});
}
}
}
推荐阅读
- azure - 如何使用 ARM 模板在存储帐户中创建 blob 容器
- r - 从数据框R中的字符列表中用字符x次填充一列
- python - Groupby 基于多个逻辑条件应用于不同的列 DataFrame
- obiee - 面向 SOA 的 OBIEE Web 服务
- python - 需要整数参数,得到浮点错误并且浮点对象不能被解释为整数错误
- javascript - Javascript 异步性质
- regex - Lucene Regex 用于字母数字匹配,但不是所有数字
- javascript - 是否可以将 keyup 功能替换为按钮单击功能?
- apache-spark - 如何获取 Azure Databricks 笔记本运行详细信息
- javascript - 如何在 JAVASCRIPT 的对象中添加键值对?