Я использую yii2 динамическую форму wbraganca и в динамической форме я использую kartik / select2. Вот мой код вида:

<div class="col-sm-8 col-md-3">                     
    <?= $form->field($detail, "[{$i}]item_id")->widget(Select2::className(), [
        'data' => ArrayHelper::map(Item::find()->all(), 'id', 'name'),
        'language' => 'en',
        'options' => ['placeholder' => 'Select a item ...', 'onchange' => 'getItemPrice($(this))'],
        'pluginOptions' => [
            'allowClear' => true,                               
         ],
   ]);
?>
</div>
<div class="col-sm-4 col-md-2">
   <?= $form->field($detail, "[{$i}]qty")->widget(MaskedInput::className(),
    [
        'clientOptions' => [
            'alias' => 'numeric',
            'groupSeparator' => ',',
            'digits' => 0,
            'autoGroup' => true,
            'removeMaskOnSubmit' => true,
            'rightAlign' => false,                                  
        ],
        'options' => [
            'class' => 'form-control',
            'onchange' => 'calculateSubtotal($(this))',                     
        ]                               
    ]) ?>
    </div>
    <div class="col-sm-4 col-md-2">
         <?= $form->field($detail, "[{$i}]price")->widget(MaskedInput::className(),
        [
            'clientOptions' => [
               'alias' => 'numeric',
               'groupSeparator' => ',',
               'digits' => 0,
               'autoGroup' => true,
               'removeMaskOnSubmit' => true,
               'rightAlign' => false,                               
            ],
            'options' => [
                'class' => 'form-control',
                'onchange' => 'calculateSubtotal($(this))',                                 
            ]
    ]) ?>
    </div>
        <div class="col-sm-4 col-md-2">
            <?= $form->field($detail, "[{$i}]total")->widget(MaskedInput::className(),
                [
                    'clientOptions' => [
                        'alias' => 'numeric',
                        'groupSeparator' => ',',
                        'digits' => 0,
                        'autoGroup' => true,
                        'removeMaskOnSubmit' => true,
                        'rightAlign' => false,
                    ]
                ]) ?>
    </div>

И это мой код JavaScript

function getItemPrice(item){
    var index  = item.attr("id").replace(/[^0-9.]/g, "");
    var item_id = $('#purchaseorderdetail-'+ index + "-item_id").val();
    $.get('../item/get-price', {id : item_id}, function(data){
        $('#purchaseorderdetail-' + index + '-price').val(data);
        $('#purchaseorderdetail-' + index + '-qty').val(1);
        $('#purchaseorderdetail-' + index + '-total').val(data);
    }); 
    calculateTotal(Number(index)+1);
}

function calculateSubtotal(item){   
    var index  = item.attr("id").replace(/[^0-9.]/g, "");   
    var qty = $('#purchaseorderdetail-' + index + '-qty').val();
    qty = qty == "" ? 0 : Number(qty.split(",").join(""));
    var price = $('#purchaseorderdetail-' + index + '-price').val();
    price = price == "" ? 0 : Number(price.split(",").join(""));
    $('#purchaseorderdetail-' + index + '-total').val(qty * price); 

    calculateTotal(Number(index)+1);
}

function calculateTotal(index){    
    var total = 0;
    for(i=0; i< index; i++){
        var subtotal = $('#purchaseorderdetail-' + i + '-total').val();        
        subtotal = subtotal == "" ? 0 : Number(subtotal.split(",").join(""));
        alert(subtotal);
        total = total + subtotal;
    }
    $('#purchaseorder-total').val(total);
}

Когда я выбираю первый элемент (цена 150 000 и кол-во 1), функция вычисления итогов всегда дает результат 0, а затем я добавляю второй элемент (цена 370 000 и кол-во 1), это дает итоговый результат = 150 000. когда я заменяю второй предмет на другой предмет, цена которого составляет 55 000, это дает в итоге 520 000.

Что я скучаю? Пожалуйста посоветуй. Спасибо

0
Wilson Ng 4 Апр 2017 в 10:58

2 ответа

Лучший ответ

Я нашел этот ответ, переместив код calculateTotal(Number(index)+1); в функцию getItemPrice(item) в фигурные скобки $.get. и вопрос теперь, когда я удаляю второй элемент, как рассчитать общий выигрыш?

1
Wilson Ng 4 Апр 2017 в 08:25

Уже нашел то, что мне нужно. просто добавьте этот код, чтобы пересчитать

jQuery(".dynamicform_wrapper").on("afterDelete", function(e) {
    jQuery(".dynamicform_wrapper .remove-item").each(function(i) {                
        calculateTotal(i+1);
    });
});
0
Wilson Ng 4 Апр 2017 в 09:10