Warm tip: This article is reproduced from serverfault.com, please click

javascript-如何设置复选框上的函数调用条件,请单击

(javascript - How to set condition for function call on checkbox click)

发布于 2020-11-29 07:01:12

我有一个表,其中包含名为NoBillBill的列其中具有复选框作为值。

表默认视图

NoBill复选框,点击一次被驻颜this.totale)值被计算。

单击nobill列中的两个复选框后,顶部的总值

比尔·列复选框,点击一次得到this.total)值被计算。它还打开了两个新列,分别称为RatioRevasst

此处的总价值和比率计算

获取比率值的公式是(total / totale)。例如,如果合计为110,而合计100,则比率为110/100 = 1.1。

因此,当我重复单击同一Bill列复选框(两次启用和禁用)时,将反复计算总值this.total)。因此,现在总值从110更新为120。因此,比率值更改为1.2,因为它现在是120/100,而不是110/100。这是我面临的问题。我只是想要只计算一次单个复选框,单击值。因此,即使该复选框被单击了多次,它也仍保持110。

重复单击相同的复选框值后,比率值更改

我的stackblitz链接

Questioner
user14704658
Viewed
0
Eliseo 2020-11-29 20:43:16

我认为你有几个变量,这使检查变得困难。

假设你有一个类似的功能

  calculateTotals()
  {
    const items=this.listes.filter(x=>x.nobillChecked || x.billChecked)
    const total=items.length?items.map(x=>x.qty*x.value).reduce((totals, data) => totals + data):0

    const items2=this.listes.find(x=>x.billChecked)?this.listes.filter(x=>x.nobillChecked):[]
    const totale=items2.length?items2.map(x=>x.qty*x.value).reduce((totals, data) => totals + data):0
    const factor=totale && total?total/totale:0
    return [total,totale,factor]
  }

看到此函数仅取决于“ listes”的值,而不更改任何值

你可以在.html中使用类似

            <tr *ngFor="let list of listes; index as i">
                <td>{{list.name}}</td>
                <td>{{list.qty}}</td>
                <td>{{list.value}}</td>
                <ng-container *ngIf="factor">
                    <td>
                        <div *ngIf="list.nobillChecked;">{{ factor|number:'1.0-2' }}</div>
                    </td>
                    <td>
                        <div *ngIf="list.nobillChecked;">{{list.value*factor|number:'1.0-2' }}</div>
                    </td>
                    <td>
                        <div>
                            {{list.nobillChecked?(list.qty*factor*list.value|number:'1.0-2'):''}}
                        </div>
                    </td>
                </ng-container>
                <td *ngIf="!factor">
                    <div>
                        {{list.nobillChecked?(list.qty*list.value|number:'1.0-2'):''}}
                    </div>
                </td>
                <td>
                    <input type="checkbox" id="vehicle3" name="vehicle3" value="Bikee"
      [disabled]="list.billChecked"
      [(ngModel)]="list.nobillChecked"
      (change)="recalculate()"
    >
  </td>
                <td>
                    <input type="checkbox" id="vehicle2" name="vehicle2" value="Bikes"
      [disabled]="list.nobillChecked"
      [(ngModel)]="list.billChecked"
      (change)="recalculate()"
    >
  </td>
            </tr>

同样,仅考虑“列表”,“因子”,“总计”和“ totale”形式的值。你可以在(更改)中再次简单地计算值

  recalculate() {
    [this.totale,this.total,this.factor]=this.calculateTotals()
  }

(我使用“解构”为这三个变量赋值)。好吧,该函数返回一个数组,并通过解构为变量赋值。

我不敢肯定正确地stackblitz中做到这一点,但认为较少的变量和较少的累积变量会使事情更易于检查。是的,当我们对性能进行调整时,看起来“重新计算”并不是很好。确实,花时间“重新计算”所有内容并不重要,并使代码更“健壮”