0

在以下示例中,我有一个简单的下拉列表,其中包含客户列表。当您从下拉列表中选择客户时,我需要完成以下操作。

  1. 选定的客户名称应显示在"txtCustomerName"文本框中。
  2. 选定的客户名称应显示在"spnCustomerId"span 元素中(我已经以某种方式完成了它,我想确保我是否使用Reactive Forms以正确的方式进行操作)。

除了上述之外,"ERROR TypeError: control.registerOnChange is not a function"加载页面时出现错误。我在 stackoverflow 上发现了类似的帖子,但我找不到我面临的问题的可靠答案。

错误类型错误:control.registerOnChange 不是函数

错误类型错误:control.registerOnChange 不是函数 --> formControlName

我的组件类看起来像这样

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  public myForm: FormGroup;
  public allCustomers: Customer[] = new Array();

  constructor(private formBuilder: FormBuilder) {}

  ngOnInit(): void {
    this.myForm = this.formBuilder.group({
      selectedCustomer: this.formBuilder.group({
        id: [],
        name:['']
      })
    })

    this.allCustomers.push(new Customer(0, "John"));
    this.allCustomers.push(new Customer(1, "Kumar"));
    this.allCustomers.push(new Customer(2, "Warma"));
    this.allCustomers.push(new Customer(3, "Sabitha"));
  }

  changeCustomer(e) {
    console.log(JSON.stringify(this.myForm.get('selectedCustomer').value));
  }
}

export class Customer {
  public id: number;
  public name: string;

  constructor(cusId: number, cusName: string) {
    this.id = cusId;
    this.name = cusName;
  }
}

我的 html 页面看起来像这样

<form name="frmMain" [formGroup]="myForm">
  <div>
    <div>
      All customers:
      <select (change)="changeCustomer($event)" formControlName="selectedCustomer">
        <option value="" disabled>Please select</option>
        <option *ngFor="let cus of allCustomers" [ngValue]="cus">{{cus.name}}</option>
      </select>
    </div>
    <br/>
    <div>
      Selected customer id :
      <span id="spnCustomerId">{{myForm.get('selectedCustomer').value.id}}</span>
    </div>
    <div>
      Selected customer name :
      <!-- I need to show selected customer name in below text box -->
      <input id="txtCustomerName" type="text"/>
    </div>
  </div>
</form>

请参阅stackblitz中的上述示例

4

3 回答 3

1

试试这样:

TS:

this.myForm = this.formBuilder.group({
  selectedCustomer: [],
  selectedCustomerName : []
})


changeCustomer(e) {
    console.log(JSON.stringify(this.myForm.get('selectedCustomer').value));
    let name = (this.myForm.get('selectedCustomer').value).name

    this.myForm.patchValue({
      selectedCustomerName : name
    });
  }

模板:

<div>
  Selected customer id :
  <span id="spnCustomerId">{{myForm.get('selectedCustomer').value?.id}}</span>
</div>
<input id="txtCustomerName" type="text" formControlName="selectedCustomerName"/>
于 2019-06-18T06:34:52.413 回答
1

发生错误是因为您正在使用 FormBuilder 初始化表单,但并非所有控件都存在于模板中(请参见此处的链接)。

尝试这个:

this.myForm = this.formBuilder.group({
  selectedCustomer: [''],
  name: ['']
})

您可以直接订阅 formControl,而不是添加更改侦听器,如下所示:

this.myForm.get('selectedCustomer').valueChanges
  .subscribe(e => {
    this.myForm.get('name').setValue(e.name);
    })

在模板中:

<input id="txtCustomerName" type="text" formControlName="name"/>
于 2019-06-18T06:44:17.520 回答
1

对不起,答案不正确。查看分叉的 stackblitz

你对 Angular 说 selectedCustomer 是一个 FormGroup

selectedCustomer: this.formBuilder.group({
        id: [],
        name:['']
      })

但是,当您使用 select 时,您试图将一个对象作为值赋予 FormGroup

<select (change)="changeCustomer($event)" formControlName="selectedCustomer">
        <option value="" disabled>Please select</option>
        <option *ngFor="let cus of allCustomers" 
             [ngValue]="cus">{{cus.name}}</option>
</select>

这是因为您有错误。

解决方案是 selectedCustomer 是一个对象,而不是 FormGroup,是的,FormControl 可以存储一个对象,而不仅仅是字符串或数字

this.myForm = this.formBuilder.group({
      selectedCustomer: []
    }) 

当然,使用安全运算符显示“名称”和“ID”时要小心,因为可以为空

<span id="spnCustomerId">{{myForm.get('selectedCustomer').value?.id}}</span>
于 2019-06-18T07:20:05.980 回答