将表单中每个循环产品的数据显示为值,而不是 Angular 中的占位符

Posted

技术标签:

【中文标题】将表单中每个循环产品的数据显示为值,而不是 Angular 中的占位符【英文标题】:Show the data of each loop product in the form as a value and not as a placeholder in Angular 【发布时间】:2021-12-26 09:59:45 【问题描述】:

我在 Angular 中使用 *ngFor 根据我的 API 的响应为每个产品打印一个表单,该响应为我提供了一个包含每个产品信息的对象数组。

发生的情况是,我正在尝试使用产品信息自动完成每个表单的输入值。

我尝试将输入中的直接值作为 value="product.description" 传递,但是 Angular 显然忽略了它。

还有 [(ngModel)] 但是,我将每个产品中的值加倍,并且在 Angular 文档中它说它已被弃用。

如果我将值作为占位符传递,它会显示在表单中,但是在尝试使用 updateProductForm.value 获取值时出现错误,因为占位符无效。

这是我的组件.ts

import  Component, OnInit  from '@angular/core';
import  FormControl, FormGroup  from '@angular/forms';
import  ApiService  from '../services/api.service';

@Component(
  selector: 'app-dashboard-listings',
  templateUrl: './dashboard-listings.component.html',
  styleUrls: ['./dashboard-listings.component.css']
)
export class DashboardListingsComponent implements OnInit 

  constructor(private _apiService: ApiService)  

  products: any = [];

  ngOnInit() 

    this._apiService.getUserProducts().subscribe(res => 
      this.products = res;
    )

  

  updateProductForm = new FormGroup(
    sku: new FormControl(),
    part_number: new FormControl(),
    description: new FormControl(),
    price: new FormControl(),
    stock: new FormControl(),
    eta: new FormControl(),
    condition: new FormControl(),
    warranty: new FormControl(),
    package: new FormControl()
  )

  updateProduct(product: any) 
    
    this._apiService.updateProducts(product.id, this.updateProductForm.value).subscribe(() => 
      console.log('Update product!');
      alert(`Update product with ID $product.id `)
    );

  


这是我的组件.html

<form [formGroup]="updateProductForm" *ngFor="let product of products" class="product-wrap">
    <div>
      <span>SKU:</span>
      <input formControlName="sku" type="text" name="" id="" placeholder="product.sku">
    </div>
    <div>
      <span>Part Number</span>
      <input formControlName="part_number" type="text" name="" id="" placeholder="product.part_number">
    </div>
    <div>
      <span>Description</span>
      <input formControlName="description" type="text" name="" id="" placeholder="product.description">
    </div>
    <div>
      <span>Stock</span>
      <input formControlName="stock" type="number" name="" id="" placeholder="product.stock">
    </div>
    <div>
      <span>Price</span>
      <input formControlName="price" type="number" name="" id="" placeholder="product.price">
    </div>

    <div>
      <span>ETA</span>
      <input formControlName="eta" type="number" name="" id="" placeholder="product.eta">
    </div>
    <div>
      <span>Condition</span>
      <input formControlName="condition" type="text" name="" id="" placeholder="product.condition">
    </div>

    <div>
      <span>Launched</span>
      <span>20-10-2021</span>
    </div>

    <div>
      <input formControlName="warranty" type="text" name="" id="" placeholder="product.warranty">
    </div>

    <div>
      <input formControlName="package" type="text" name="" id="" placeholder="product.package">
    </div>

    <div>
      <span>delete</span>
      <span>product.id</span>
    </div>

    <div>
      <button [disabled]="!updateProductForm.dirty" (click)="updateProduct(product)" type="submit"
        class="btn-blue">Update</button>
    </div>
  </form>

这是它在屏幕上的打印方式:

【问题讨论】:

【参考方案1】:

问题在于您的表单,实际上,您正在循环表单,

<form [formGroup]="updateProductForm" *ngFor="let product of products" class="product-wrap">

这也创建了具有相同表单组的表单的多个实例。这里的重点是Form Group的最后一个实例会影响.component.ts表单组内的数据。

要通过 API 使用多个表单编辑数据,您需要使用 Form Array 来处理表单的多个动态性质。

点击链接以获取您的问题的解决方案。 Angular Form Array Manual and Example

【讨论】:

是的,当您不需要明确定义表单组时,[(ngModel)] 很有用。 我的建议是在 Array 中设置每个 Form GRoup 值,然后在模板中循环表单组,它会自动填充模板中的 formControls。

以上是关于将表单中每个循环产品的数据显示为值,而不是 Angular 中的占位符的主要内容,如果未能解决你的问题,请参考以下文章

PATCH 方法将 NULL 设置为值而不是值

SonataProductBundle(symfony 2.8)而不是显示产品创建表单,而是出现“没有可用的对象类型”按钮

Django 编辑表单数据:数据被复制而不是被更新

PySpark 将低于计数阈值的值替换为值

Django模型表单集显示数据库数据而不是空表单集

在 for 循环期间访问嵌套对象 VueJS