Вычислить вновь помещенные данные в массив с помощью цикла - PullRequest
0 голосов
/ 05 мая 2018

У меня проблемы с правильным вычислением числовых значений в массиве внутри цикла.

Сценарий

  • tbody создает список динамических значений.
  • button внутри td имеет function, называемый preBookThis() с params.
  • Когда пользователь нажимает button, он запускает function, а затем push data в array variable.
  • После нажатия будет for loop, который будет выполнять итерацию и вычислять значения. ($scope.nights - это две даты - т.е. 2018-05-05 и 2018-05-07, поэтому он будет иметь значение 2)

Проблема

  • Давайте представим, что в tbody было три строки и имеют следующие значения.

    $scope.nights = 2; row1 = 100; row2 = 200; row3 = 300;

  • Когда пользователь нажимает button в строке 1 , вычисление работает и выполняется как ожидалось

    amount_row1 = 200;

но ...

  • Когда пользователь нажимает button в строке 2 , вычисленные значения первой строки будут удвоены.

    amount_row1 = 400; amount_row2 = 400;

а также ...

  • Когда пользователь нажимает button в строке 3 , вычисленные значения первой строки и второй строки снова удваиваются.

    amount_row1 = 800; amount_row2 = 800; amount_row3 = 600;

Окончательный результат должен быть:

 amount_row1 = 200;
 amount_row2 = 400;
 amount_row3 = 600;

HTML

<tbody ng-repeat="room in roomsDisplay">
    <tr>
        <td>
            <div class="col-md-6"><img ng-src="images/rooms/{{room.room_image}}"></div>         
        </td>
        <td>
            <div style="margin-top: 20px;"><input type="button" 
                ng-click="preBookthis({room})" class="btn btn-primary" 
                value="Book this Room"></div>
        </td>
    </tr>
</tbody>

JS

$scope.preBookthis = function(data){
    $scope.totalAmount = 0;
    $scope.bookData.push({ 
        'room_name': data.room.room_name, 
        'price': data.room.price,
        'amount': $scope.amount,
        'id' : data.room.rooms_type_id
    });

    _.forEach($scope.bookData, function(value, key){
        value.amount = value.amount * $scope.nights;
    });
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Проблема возникает из-за того, что $scope.bookData полностью изменяется при каждом вызове функции.

Когда вызывается функция, $scope.bookData может содержать объекты для других строк. эти объекты имеют значение amount. В вашем цикле вы умножаете это значение на $scope.nights (что равно 2).

Таким образом, вы умножаете все значения строк на 2.

Вы неоднократно меняете значения для amount.

попробуйте это:

_.forEach($scope.bookData, function(value, key){
    value.amount = (key+1) * $scope.nights*100;
});

EDIT:

На самом деле, другой ответ предлагает лучшее решение.

0 голосов
/ 05 мая 2018

Выполнять вычисления только один раз, когда вы добавляете новый объект, и не зацикливаться на всех других, которые уже рассчитали его

Что-то вроде:

$scope.preBookthis = function(data){
    $scope.totalAmount = 0;
    $scope.bookData.push({ 
        'room_name': data.room.room_name, 
        'price': data.room.price,
        'amount': $scope.amount * $scope.nights,// calculate only for this item
        'id' : data.room.rooms_type_id
    });  
}
...