Angular - 从服务重新填充表单输入

Posted

技术标签:

【中文标题】Angular - 从服务重新填充表单输入【英文标题】:Angular - Re-Populate form inputs from service 【发布时间】:2017-12-09 17:43:45 【问题描述】:

我有一个基本的 Angular 组件,当用户进入个人资料并点击“编辑”时,它允许某人编辑用户的详细信息。

组件:

export class EditUserComponent implements OnInit 

    // Define our vars
    user: Users[];
    editUserForm: FormGroup;
    message: ;
    displayMessage = false;
    userID: number;
    errorMessage: any = '';

    constructor(
        private fb: FormBuilder,
        private _userService: UserService,
        private activatedRoute: ActivatedRoute
    ) 
    

    ngOnInit(): void 

        // Get the userID from the activated route
        this.activatedRoute.params.subscribe((params: Params) => 
            this.userID = params['id'];
        );

        // Call our service and pass the UserID
        this._userService.getUser(this.userID)
            .then(res => 
                this.user = res;
                this.createForm();
            );

    

    // Generate the form
    createForm() 
        this.editUserForm = this.fb.group(
            QID: ['', Validators.required],
            favoriteColor: [''],
            favoriteNumber: [''],
            favoriteActor: ['']
        );
    


服务:

// Fetch a single user
    getUser(userID: number) 
        return this._http.post(this.baseUrl + '/fetchUser',  "userID": userID ,  "headers": this.headers )
            .toPromise()
            .then(res => res.json())
            .catch(err =>  this.handleError(err); );
    

界面:

export interface Users 
    RecordID?: number;
    QID: string;
    favoriteColor?: string;
    favoriteNumber?: number;
    favoriteActor?: string;

我正在尝试将值传递给我的 formGroup,但我无法弄清楚如何访问这些值。

我以为我可以做这样的事情,我可以访问用户模型并从中选择一个属性,但这会引发未定义的错误。

我是在表单组中传递值还是以某种方式直接将它们绑定到元素?我可以很好地从服务接收数据,只是不确定如何将每个值返回到各自的字段。

createForm() 
    this.editUserForm = this.fb.group(
        QID: [this.user.QID, Validators.required],
        favoriteColor: [''],
        favoriteNumber: [''],
        favoriteActor: ['']
    );

【问题讨论】:

【参考方案1】:

如果我理解正确......这就是我的代码的样子:

onProductRetrieved(product: IProduct): void 
    if (this.productForm) 
        this.productForm.reset();
    
    this.product = product;

    // Update the data on the form
    this.productForm.patchValue(
        productName: this.product.productName,
        productCode: this.product.productCode,
        starRating: this.product.starRating,
        description: this.product.description
    );
    this.productForm.setControl('tags', this.fb.array(this.product.tags || []));

我使用patchValue 作为值,setControl 作为数组。

由于您是在检索数据后创建表单,因此您可以执行以下操作:

createForm() 
    this.editUserForm = this.fb.group(
        QID: [this.user.QID, Validators.required],
        favoriteColor: [this.user.favoriteColor],
        favoriteNumber: [this.user.favoriteNumber],
        favoriteActor: [this.user.favoriteActor]
    );

为了完整……每个输入元素都需要一个 formControlName 属性,如下所示:

                    <input class="form-control" 
                            id="productNameId" 
                            type="text" 
                            placeholder="Name (required)" 
                            formControlName="productName" />
                    <span class="help-block" *ngIf="displayMessage.productName">
                            displayMessage.productName
                    </span>
                </div>

您可以在此处找到完整的工作示例:https://github.com/DeborahK/Angular2-ReactiveForms

【讨论】:

因此,您使用this.user.QID 的第二个示例是我的理想解决方案,也是我首先尝试的,但我收到“'Users[]' 类型上不存在属性'QID'”的错误。 .我认为它是正确的,因为它在我的界面中定义。 这正是它所说的吗?如果是这样,那么它认为this.user 是一个数组。你是从getUser 得到一个数组而不是得到一个用户吗? 哦...我明白了...您已将其声明为顶部的数组:user: Users[]; 如果它不应该是数组,则将其更改为user: Users(没有数组)。 啊,很好,这有效:QID: [this.user[0].QID, Validators.required],【参考方案2】:

将提交事件绑定到您的表单,然后使用 this.editUserForm.value 访问表单中的数据。

在组件模板中:

<form [formGroup]="editUserForm" (submit)="saveIt()">

在组件中:

  saveIt() 
    if (this.editUserForm.dirty && this.editUserForm.valid) 
      alert(`Number: $this.editUserForm.value.favoriteNumber Actor: $this.editUserForm.value.favoriteActor`);
    
  

【讨论】:

这看起来像反应形式......所以不需要从模板中传递它。 我不想将值输入到表单中。这个页面有一些我需要从数据库(服务调用)中填写的输入字段,以便可以更新它们。本质上,我将这些字段的值设置为从数据库中获取的值。

以上是关于Angular - 从服务重新填充表单输入的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular 2 上的查询参数中预填充输入文本框

编辑填写的表格并使用 Ionic/Angular 重新提交

表单未预先填充Angular 8

angular 7 反应式表单:为表单中的每个输入字段动态添加/删除输入字段

Angular 2 根据用户输入重新加载当前组件

提交表单后如何重新填充表单数据以及错误