如何检查数字是否大于ng-change上的数字

时间:2018-12-28 03:02:46

标签: javascript angularjs

screenshot)。

Stackblitz:

请检查:https://stackblitz.com/edit/angularjs-vc9lg5

我有一个数字Total expense和一个数据表。

有一列Amt。该列包含预付款,可以通过在Amt旁边的输入框中输入来扣除并支付给当期费用(1000)。

正如您在第三栏中看到的那样,我已经输入了500,现在我可以在第一行中输入500(或在第二行中输入100,在第一行中输入400)。

在输入框的ng-change上,通过计算deductedTillNowbalanceLeftInExpense,检查输入的金额是否大于可从总费用中扣除的余额。

您可以在Chrome扩展程序中看到右侧的$scope变量deductedTillNowbalanceLeftInExpense的值。当我尝试通过输入50从第一行中减去剩余的500时,balanceLeftInExpense变为450。

所以我的验证不允许输入下一个数字,因为我尝试在500balanceLeftInExpense450和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。

2 个答案:

答案 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,由于支票不允许输入,您无需禁用文本框。