在编辑表单上以编程方式选择自动完成设置值ngModel

时间:2020-05-26 21:21:24

标签: angular angular-material angular2-forms angular9 ngmodel

进入编辑表单时,我需要将值预填到表单中。

创建表单可以正常工作,并且可以很好地提交值,

HTML:

<!-- customers-->
<div class="col-md-6">
  <mat-form-field class="example-full-width">
    <input type="text"
           placeholder="Customers"
           i18n-placeholder="customerInput"
           aria-label="customers"
           matInput
           required
           [name]="'customerId'"
           (focus)="getCustomers(searchedCustomer)"
           [ngModel]="contractInterface.customerName"
           (ngModelChange)="customerOnChange($event)"
           [matAutocomplete]="autoCustomer">
    <mat-autocomplete #autoCustomer="matAutocomplete" [displayWith]="customerCollectionDisplayFn">

      <mat-option *ngIf="customerloading"><span [ngTemplateOutlet]="loading"></span></mat-option>

      <ng-container *ngIf="!customerloading">
        <mat-option *ngFor="let customer of customerList" [value]="customer">
          {{ customer.name }}
        </mat-option>
      </ng-container>
    </mat-autocomplete>
  </mat-form-field>
</div>

我使用[displayWith]="customerCollectionDisplayFn"将值显示给输入

TS:

  customerCollectionDisplayFn(customer?) {
return customer?.name;
}

2 个答案:

答案 0 :(得分:0)

    1. When you click the "Edit Form" Button you have to gather the persisted 
information for the form inputs fields. this might be from localstorage or from 
http request via angular service ([Angular Tutorial Http Server][1]) like in 
section --> "app/config/config.service.ts (getConfig v.1)".


    2. then create an empty "contractInterface" property in your component and 
update it after you got the infos from localstorage or http request


    like ...
    contractInterface: any = {};

    or ...
    contractInterface: BlaInterface = new BlaInterface();

    later...

    loadMyFormValues() {
      this.myFormService.myGetFormValuesFn()
        .subscribe((contractInterface: any) 
        => this.contractInterface = contractInterface);
    }


      [1]: https://angular.io/guide/http#requesting-data-from-a-server

ps:在变量名中使用单词interface可能会造成混淆。就个人而言,我更喜欢避免这种情况。也可以在接口名称本身中输入(如果适用)。

答案 1 :(得分:0)

所以我只是更改了ngModel [ngModel]="customer"然后

  private getContractDetails(id: number) {

    this.contractService.loadContractDetails(id)
      .subscribe( (rez: Contract) => {
        // add value to customer input
        this.customer.name = rez.customerName; // <-- this

它起来了。

-奖金---

对于选择输入,此方法有效

HTML:

 <mat-form-field>
        <mat-label i18n="@@typeInput">Type</mat-label>
        <mat-select
          name="typeId"
          [ngModel]="typesVal" // <--- this
          (ngModelChange)="setContractType($event)"
          #item="ngModel">
          <mat-option *ngIf="isLoadingTypes"><span [ngTemplateOutlet]="loading"></span></mat-option>
          <ng-container *ngIf="!isLoadingTypes">
            <mat-option>None</mat-option>
            <mat-option *ngFor="let item of contractTypeList" [value]="item">{{ item.name }}</mat-option>
          </ng-container>
        </mat-select>
      </mat-form-field>

代码

this.typesVal = this.contractTypeList.find(x => x.id === rez.typeId);