【问题标题】:How to set condition for function call on checkbox click如何在复选框单击时设置函数调用的条件
【发布时间】:2021-03-11 10:37:25
【问题描述】:

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

表格默认视图

NoBill 复选框被点击一次 totale(this.totale) 值被计算出来。

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

total(this.total) 值计算后,点击 Bill 列复选框。它还会打开两个名为 RatioRevasst 的新列。

总价值和比率计算在这里

比率的计算公式是(total/totale)。例如,如果 total 为 110,如果 totale 为 100,则比率为 110/100=1.1。

所以当我重复点击同一个 Bill 列复选框时(启用和禁用 2 次) total(this.total) 的值会被重复计算。所以现在 total 值从 110 更新到 120。因此,Ratio 值更改为 1.2,现在它的 120/100 而不是 110/100。这是我面临的问题。我只想为单个复选框单击计算一次 total 值。这样即使多次单击,该复选框单击仍保持 110。

重复点击同一个复选框值后比率值发生变化

My stackblitz link

【问题讨论】:

    标签: javascript angular npm angular6 angular7


    【解决方案1】:

    我认为你有几个变量,这很难检查。

    想象一下你有一个类似的函数

      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>
    

    同样,仅考虑“list”、“factor”、“total”和“totale”形式的值。您可以在(更改)中简单地再次计算值

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

    (我使用“解构”来给三个变量赋值)。嗯,函数返回一个数组,解构赋予变量值。

    我不太确定是否正确in the stackblitz,但认为更少的变量和更少的变量要累积,使事情更容易检查。是的,当我们考虑性能时,可以看出“重新计算”并不是很好。真的把时间花在“重新计算”上没有意义,让代码更“健壮”

    【讨论】:

    • 唯一的是计算qut*value,第一个过滤器是“nobillChecked”和“billChecked”,然后计算总和(如果数组为空,我们需要考虑)。我更喜欢返回一个包含函数值的数组并使用解构:解构只是在打字稿中你可以写一些像[this.a,this.b]=[1,2] 等于make this.a=1;this.b=2。另一种方法是简单地在函数makethis.total=total;this.totale=total;this.factor=factor中,不返回任何东西,简单地调用函数。
    • 如果items.length(如果数组包含它不是一个空数组),做map和reduce,否则值为0,它是“三元运算符”:value=(condition)?value1:value2它是一样的那if (condition)value=value1 else value=value2
    • 我只在totale0和total0(两者)时才设置factor=total/totale,否则factor=0 - 这是为了方便如何在.html中显示值 - 是的,在你可以使用打字稿if (variable){...}ìf (variable!==0 &amp;&amp; variable!==undefined &amp;&amp; variable!==null &amp;&amp; avariable!==""){...} 相同
    • 0 - 可以是负数-
    • *ngIf="factor" 在因子0 时显示 *ngIf="!factor" 仅在因子==0 时显示
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 2019-04-17
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多