获取Angular中动态命名输入的值

时间:2018-10-10 23:03:25

标签: javascript angular

在我的fee-list.component.html模板中,我有以下类似内容:

<div class="container">
  <div class="row" *ngFor="let meta of fees">

<div class="table-responsive">
    <table class="table">
      <thead>
        <tr>
      <th>Amount owing (AUD)</th>
      <th>Fee type</th>
      <th>Title</th>
      <th>Amount to pay (AUD)</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let fee of meta.fee">
      <td>{{ fee.balance }}</td>
      <td>{{ fee.type.desc }}</td>
      <td>{{ fee.title }}</td>
      <td><input id="{{ fee.id }}" type="text" name="toPay" value="{{ fee.balance }}"></td>
    </tr>
  </tbody>
</table>
</div>
  <div class="row">
    <div class="col-md-4"><strong>Total to pay: </strong><input type="text" name="total" value="{{ meta.total_sum }}"> </div>
  </div>
  </div>
</div>

对我的界面的要求是双重的。如果用户更改单个费用(费用余额)的值,则总文本输入字段中的值应更新。 其次,如果更新了总输入字段,那么我需要相应地更新单个费用中的值(将这些费用从最早的费用减少到最新的费用)。

我的问题是,尽管这些输入字段确实具有唯一的ID(id =“ {{Fee.id}}),但如何为这些动态生成的输入字段绑定呢?我无法解决如何确定单个费用的目标我的打字稿文件中的字段。

3 个答案:

答案 0 :(得分:0)

一种方法(首选)是动态创建控件。

您的打字稿文件:

  constructor(){
    this.formGroup = new FormGroup();

     const controls = meta.fee.map((fee)=>{
         this.formGroup.addControl(fee.id, new FormControl(fee.balance))
     });

    // now you have a formGroup with all the controls and their value are initialized, you just need to use it in your template 
  }

您的模板:

<tbody>
    <tr *ngFor="let fee of meta.fee">
      <td>{{ fee.balance }}</td>
      <td>{{ fee.type.desc }}</td>
      <td>{{ fee.title }}</td>
      <td><input id="{{ fee.id }}" [formControl]="formGroup.get(fee.id)" type="text" name="toPay"></td>
    </tr>
  </tbody>

因此,很显然,在此之后,您就可以做任何事情,例如,如果您想更新其中的一个特定的东西:

  updateValue(){
   this.formGroup.get('oneOfThoseFeeIds').setValue('new value')
  }

注意: 我有一段时间没有做过Angular了,不记得确切的语法,但是我希望这可以给您一条路径

答案 1 :(得分:0)

使用ngModel进行双向绑定

<input [name]="fee.id" type="text" [(ngModel)]="fee.balance">

现在,当用户在文本框中键入内容时,它将直接更新数组中的值。

同样,您不应在属性上使用{{}}绑定,而应使用[box]语法使用属性绑定。

<input type="text" name="total" [value]="total_sum">

您可以像这样在TypeScript中计算总数

get total_sum() {
    return meta.fees.reduce((total, fee) => total + fee.balance, 0);
}

答案 2 :(得分:-1)

您不能仅为此使用服务吗?我想这是一种解决方法,因为您应该尝试使组件尽可能的小,并通过服务进行通信。

请查看角度文档中的本章:https://angular.io/tutorial/toh-pt4