Stackblitz:
请检查:https://stackblitz.com/edit/angularjs-vc9lg5
我有一个数字Total expense
和一个数据表。
有一列Amt
。该列包含预付款,可以通过在Amt
旁边的输入框中输入来扣除并支付给当期费用(1000)。
正如您在第三栏中看到的那样,我已经输入了500,现在我可以在第一行中输入500(或在第二行中输入100,在第一行中输入400)。
在输入框的ng-change
上,通过计算deductedTillNow
和balanceLeftInExpense
,检查输入的金额是否大于可从总费用中扣除的余额。
您可以在Chrome扩展程序中看到右侧的$scope
变量deductedTillNow
和balanceLeftInExpense
的值。当我尝试通过输入50
从第一行中减去剩余的500时,balanceLeftInExpense
变为450。
所以我的验证不允许输入下一个数字,因为我尝试在50
,0
,balanceLeftInExpense
为450
和500为下一个数字大于450。如何允许输入500?
//calculate amount till now
$scope.deductedTillNow = 0;
for (let j = 0; j < $scope.amountLedgerListArray.length; j++) {
if($scope.amountLedgerListArray[j].adjustAmount){
$scope.deductedTillNow = $scope.amountLedgerListArray[j].adjustAmount + $scope.deductedTillNow;
}
}
//calculate balance left in expense
$scope.balanceLeftInExpense = $scope.totalExpenseAmount - $scope.deductedTillNow;
检查输入的金额是否大于balanceLeftInExpense
-变动:
if(item.adjustAmount > $scope.balanceLeftInExpense){
item.adjustAmount = item.adjustAmount.toString();
item.adjustAmount = item.adjustAmount.substring(0, item.adjustAmount.length - 1);
item.adjustAmount = parseInt(item.adjustAmount);
}
html:
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Payment Ref no</th>
<th>Date</th>
<th>Amt</th>
<th >Adjust amount</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in amountLedgerListArray">
<td>
{{item.payment_ref_no}}
</td>
<td>
{{item.payment_date}}
</td>
<td>
{{item.amount}}
</td>
<td>
<input type="number" name="sgst" class="form-control"
ng-disabled="item.isDisabled" autocomplete="off"
ng-change="calculateBalanceAndRestrict(item)"
ng-class="{'borderRedError' : expense.$invalid}"
ng-model="item.adjustAmount" onkeypress="limitKeyPress(this, 10, event)" />
</td>
</tr>
</tbody>
</table>
修改:
Amt列中的数据是已支付的预付款。现在有一笔支出(本示例中为1000。请参见屏幕快照Total expense:1000
)。我可以从Amt
列中的任何行中扣除。
在这里,我从第三行中扣除了500(当前余额:500)。我可以从前两行中减去剩余的500。从第二行开始100(因为它只有100),然后从第一行剩下500,或者从第一行剩下500。
我这样验证:在更改输入框时,我检查输入的金额是否大于所有输入金额的总和(deductedTillNow
)。当我现在开始在第一行中键入内容时,将计算出费用中剩余的余额。当我输入50时,剩下的余额为450(1000-500(第三行)+ 50(第一行))。
当我在第一行中其余的500中输入50之后,再输入0时,余额为450。所以我的验证不允许这样做(输入的500大于450)。我需要允许输入500。
答案 0 :(得分:0)
将您的if条件更改为以下内容:
if(($scope.totalExpenseAmount <= $scope.deductedTillNow) || (($scope.totalExpenseAmount - $scope.deductedTillNow) < item.adjustAmount) ){
item.adjustAmount = item.adjustAmount.toString();
item.adjustAmount = item.adjustAmount.substring(0, item.adjustAmount.length - 1);
item.adjustAmount = parseInt(item.adjustAmount);
}
答案 1 :(得分:0)
您的代码中的主要问题是您错误地检查了余额
if(item.adjustAmount > item.amount || (item.amount <= 0)){
item.adjustAmount = null;
return
}
扣除此金额后,应检查剩余余额
$scope.balanceLeftInExpense = $scope.totalExpenseAmount - $scope.deductedTillNow;
if ($scope.balanceLeftInExpense < 0) {
item.adjustAmount = item.adjustAmount.toString();
item.adjustAmount = item.adjustAmount.substring(0, item.adjustAmount.length - 1);
item.adjustAmount = parseInt(item.adjustAmount);
}
在需要检查每一行及其数据的地方,帐户禁用代码似乎也出错 您应该像这样检查每一行及其费用
//if amount entered is equal to advance paid of that row, enable others
for (let i = 0; i < $scope.amountLedgerListArray.length; i++) {
if (Number($scope.amountLedgerListArray[i].amount) < $scope.amountLedgerListArray[i].adjustAmount) {
$scope.amountLedgerListArray[i].isDisabled = false;
}
else {
//disable those that dont have a value in it
if ($scope.amountLedgerListArray[i].advance_id != item.advance_id && !$scope.amountLedgerListArray[i].adjustAmount && Number($scope.amountLedgerListArray[i].amount) < $scope.amountLedgerListArray[i].adjustAmount) {
$scope.amountLedgerListArray[i].isDisabled = true;
}
}
}
Demo,由于支票不允许输入,您无需禁用文本框。