Как проверить, больше ли число, чем число на ng-change - PullRequest
0 голосов
/ 28 декабря 2018

screenshot).

Stackblitz:

Пожалуйста, проверьте: https://stackblitz.com/edit/angularjs-vc9lg5

У меня есть номер Total expense и таблица данных.

Есть столбец Amt.Столбец содержит авансовый платеж, который можно вычесть и оплатить до текущих расходов (1000), введя в поле ввода рядом с Amt.

. Как видно из третьего столбца, я ввел 500, сейчасЯ могу ввести 500 в первом ряду (или 100 во втором и 400 в первом ряду).

На ng-change поля ввода Я проверяю, превышает ли введенная сумма остаток, вычитаемый из общей суммы расходов, путем вычисления deductedTillNow и balanceLeftInExpense.

В расширении Chrome вы можете видеть значения $scope переменных deductedTillNow и balanceLeftInExpense справа.Когда я пытаюсь вычесть оставшиеся 500 из первой строки, введя 50, 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 - VAlidation:

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 (первый ряд)).

Когда я набираю 0 после 50 для оставшихся 500 в первом ряду, остаток равен 450Так что моя проверка не позволяет этого (500 набрано больше, чем 450).Мне нужно позволить набрать 500.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Основная проблема в вашем коде заключается в том, что вы неправильно проверяете баланс баланса

 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;           

      }
    }
  }

Демо , вам не нужно отключать текстовое полепоскольку ваш чек не позволяет войти.

0 голосов
/ 28 декабря 2018

Измените условие 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...