【问题标题】:Angular 9 Reactive Form - Array Form - selecting a value to fill automatically other cells in the same rowAngular 9 Reactive Form - Array Form - 选择一个值以自动填充同一行中的其他单元格
【发布时间】:2020-07-29 14:33:52
【问题描述】:

我在 Angular 中继续我的学习曲线,但我再次陷入困境,我想知道是否有人可以帮助我。

场景
我有一个表格,表格里面有一张桌子。 该表包含许多单元格,但它从用户从下拉列表中选择一个值开始。一旦用户选择了一个值,许多其他单元格将被自动填充(基于选择的单元格)。

问题
似乎通过使用响应式表单,我遇到了另一种麻烦,因为 onchanges 不起作用,我尝试将 arrayform 订阅到 observable 但我现在得到的只是 object:object

这是 HTML 代码:

<tr *ngFor="let itemrow of myorderForm.get('itemRows')['controls']; let i=index" [formGroupName]="i">
  <td>
    <input formControlName="orderLineNumber"  type="text" placeholder="{{ i + 1 }}">
  </td>
  <td>
    <select  formControlName="productName" input id="productName" [name]="productName" type="text">
        <option *ngFor="let thisproduct of allproducts;" value="thisproduct">{{thisproduct.productName}}</option>
     </select>                                  
   </td>
   <td> 
     <input formControlName="productScaleUoM" id="productScaleUoM" [name]="itemrow.productScaleUoM+ '_' + i" type="text"  [(ngModel)]="itemrow.productScaleUoM" placeholder="{{valueScale}}">
    </td>
    <td>
      <input formControlName="pack_quantity"  id="pack_quantity" [name]="itemrow.pack_quantity+ '_' + i" type="text"   [(ngModel)]="itemrow.pack_quantity" placeholder="{{valuePack}}">
    </td>
</tr>

TS 文件如下所示:

addNewRow() {
  this.formArr.push(this.initItemRows());
}

onChangeObj(newObj) {
  this.productname[0] = newObj;
  this.valueScale = this.productname[0].productScaleUoM
  this.valuePack = this.productname[0].pack_quantity
}

deleteRow(index: number) {
  this.formArr.removeAt(index);
}
formControlValueChanged() {
//Just testing to see if I get the value of the product name
    this.myorderForm.get('itemRows').valueChanges.subscribe(val => {
      this.formattedMessage = `My name is ${val}.`;
      console.log("What is formatted message here", this.formattedMessage)
    });

再次感谢任何帮助。

【问题讨论】:

  • 不要将 ngModel 与 formcontrols 混合使用。要么选择基于 tmate 的表单,要么选择响应式表单。你不能混合它们。
  • 感谢@MikeOne 我现在更改了代码以摆脱基于模板的,但不是我正在努力让订阅正确检查对表单数组的更改。我得到的只是对象:更改选择时的对象。这是反应式表单的工作方式,仅适用于自动完成表单中的其他字段吗?
  • 在你的组件中尝试使用 console.log 的东西,或者在你的模板中使用 json 管道(以防止 [object object]..

标签: html angular typescript ngfor ngmodel


【解决方案1】:

对于这种情况,您应该 添加一些内容,例如:

<select (change)="onChangeFunction($event)" >

标签中的函数并添加

<option [value]="thisproduct">

现在调用函数

onChangeFunction(data:any){
this.list=data;
console.log(this.list); //here you will get all the data on change event
}

如果你又卡住了,请评论。

【讨论】:

  • 您好,非常感谢您的帮助,我进行了您建议的更改,确实在列表中我得到了很多数据,但并不是我真正需要的数据。在这一点上,我的目标是获得与使用 NgModel 时相同的结果。使用我得到的那个方法: onChangeObj(newObj){ console.log("what is newobj here", newObj); this.productname[0] = newObj; this.valueScale = this.productname[0].productScaleUoM this.valuePack = this.productname[0].pack_quantity。仅使用响应式表单如何实现这一目标?
  • 嗨,试试这个,[value]="thisproduct.productName"。无论您将在 [value] 中传递什么,您都将在 console.log(this.list) 中获得该数据。我希望它会起作用。
  • 嗨,还是不行,这是我得到的:事件 {isTrusted: true, type: "change", target: select#productName.ng-untouched.ng-pristine.ng-valid , currentTarget: select#productName.ng-untouched.ng-pristine.ng-valid, eventPhase: 2, ...} 气泡: true cancelBubble: false 可取消: false 组合: false currentTarget: null defaultPrevented: false
  • 你会在 currentTarget -> value 下得到你的值,试试这个。还有另一种方法可以获得确切的价值,而不是 $event 你可以放 hisproduct.productName ,但我更喜欢第一种。
  • 使用该选项我得到另一个错误...错误 TS2339:“FullOrderComponent”类型上不存在属性“thisproduct”。还有为什么 的占位符没有在表单数组中实例化?由于输入没有被记录,我必须遗漏一些基本的东西......我非常感谢你的帮助。我的目标是能够在用户选择选项后立即自动填充多个字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多