我有一个表,其中包含名为NoBill和Bill的列,其中具有复选框作为值。
表默认视图
当NoBill复选框,点击一次被驻颜(this.totale)值被计算。
单击nobill列中的两个复选框后,顶部的总值
当 比尔·列复选框,点击一次得到总(this.total)值被计算。它还打开了两个新列,分别称为Ratio和Revasst。
此处的总价值和比率计算
获取比率值的公式是(total / totale)。例如,如果合计为110,而合计为100,则比率为110/100 = 1.1。
因此,当我重复单击同一Bill列复选框(两次启用和禁用)时,将反复计算总值(this.total)。因此,现在总值从110更新为120。因此,比率值更改为1.2,因为它现在是120/100,而不是110/100。这是我面临的问题。我只是想总要只计算一次单个复选框,单击值。因此,即使该复选框被单击了多次,它也仍保持110。
重复单击相同的复选框值后,比率值更改
我认为你有几个变量,这使检查变得困难。
假设你有一个类似的功能
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中做到这一点,但认为较少的变量和较少的累积变量会使事情更易于检查。是的,当我们对性能进行调整时,看起来“重新计算”并不是很好。确实,花时间“重新计算”所有内容并不重要,并使代码更“健壮”
唯一的方法是计算qut *值,第一个过滤器是“ nobillChecked”和“ billChecked”,然后计算总和(如果数组为空,则需要考虑)。我更喜欢返回一个带有函数值的数组并使用解构:解构只是在typescript中您可以编写类似于
[this.a,this.b]=[1,2]
make的内容this.a=1;this.b=2
。另一个方法只是在函数make中this.total=total;this.totale=total;this.factor=factor
,并且不返回任何东西,只需调用该函数即可。如果items.length(如果数组包含它不是一个一个空数组),使地图和减少,否则该值为0,这是“三元运算符”:
value=(condition)?value1:value2
它是相同的是if (condition)value=value1 else value=value2
仅当totale <> 0和total <> 0(两者)时,我才使factor = total / totale,否则factor = 0-简化如何显示.html中的值-是的,在打字稿中,您可以使用
if (variable){...}
与ìf (variable!==0 && variable!==undefined && variable!==null && avariable!==""){...}
<> 0-可以为负-
*ngIf="factor"
显示,如果因子<> 0*ngIf="!factor"
仅示出如果因子== 0