簡體   English   中英

在動態字段上自動填充Ajax響應

[英]Auto-Fill ajax response on dynamic fields

我正在對ajax請求使用自動填充,這對於靜態字段也能正常工作。 例如:

$this->registerJs("$(document).delegate('.form-control','change',function(event){

    $.ajax({
        url: '".yii\helpers\Url::toRoute("ot-note/instrument1")."',
        dataType: 'json',
        method: 'GET',
        data: {id: $(this).val(),
        },
        success: function (data, textStatus, jqXHR) {
            $('#otinstrumententry-0-instrument_code').val(data.instrument_code);

            },

         beforeSend: function (xhr) {
            alert('loading!');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log('An error occured!');
            alert('Error in ajax request');
        }
    });
});");

我的字段是動態添加的,不適用於動態添加的字段,代碼是這樣的:字段的id變得像#field-0-instrument_code #field-1-instrument_cdoe

除了第一個字段外,Jquery無法識別連續的字段,這些字段是動態添加的。

我該如何解決這個問題。 謝謝。

動態字段的附加代碼

<div id="instrument_entry">
    <h3>Instruments Used</h3>
    <?php $id = 0; ?>

    <?php foreach ($otinstrumentModels as $otinstrument) { ?>      

        <div id="language" class="work-data-pad brdr-work marbtm10 row">
            <div class="col-md-4">     
            <?= $form->field($otinstrument, '[' . $id . ']' . 'instrument_name')->DropDownList(ArrayHelper::map(\app\models\Instrument::find()->all(), 'id', 'instrument_name' ),
[ 'prompt' => 'Please Select' ])?>    
            </div>
            <div class="col-md-2">     
            <?= $form->field($otinstrument, '[' . $id . ']' . 'instrument_code')->textInput(['maxlength' => 255,'class'=>'form-control']) ?>      
            </div>
            <div class="col-md-1">     
            <?= $form->field($otinstrument, '[' . $id . ']' . 'hrs_time')->textInput(['maxlength' => 255])->label('Hrs-Time') ?>      
            </div>
            <div class="col-md-2">     
            <?= $form->field($otinstrument, '[' . $id . ']' . 'total_charges')->textInput(['maxlength' => 255]) ?>      
            </div>
            <?php ?>
    <div style="margin-top: 30px;" class="col-md-3 <?php echo ($id < 1) ? 'dnone' : 'dblock'; ?>" id="divDelete" class="row-fluid">           
    <a class="ft11 btn-remove" onclick="deleteSection(this, 'instrument_entry');"><span class="marleft18">Remove</span></a>               
    </div>  
</div>
    <?php $id++; ?> 
    <?php } ?>
</div>

生成的HTML

<div id="instrument_entry">
    <h3>Instruments Used</h3>



        <div id="language" class="work-data-pad brdr-work marbtm10 row">
            <div class="col-md-4">     
            <div class="form-group field-otinstrumententry-0-instrument_name">
<label class="control-label" for="otinstrumententry-0-instrument_name">Instrument Name</label>
<select id="otinstrumententry-0-instrument_name" class="form-control" name="OtInstrumentEntry[0][instrument_name]">
<option value="">Please Select</option>
<option value="1">IMPLANTS(ORTHOPEDIC)</option>
<option value="2">O2 CHARGES PER HOUR</option>
</select>

<div class="help-block"></div>
</div>    
            </div>
            <div class="col-md-2">     
            <div class="form-group field-otinstrumententry-0-instrument_code">
<label class="control-label" for="otinstrumententry-0-instrument_code">Instrument Code</label>
<input type="text" id="otinstrumententry-0-instrument_code" class="form-control" name="OtInstrumentEntry[0][instrument_code]" maxlength="255">

<div class="help-block"></div>
</div>      
            </div>
            <div class="col-md-1">     
            <div class="form-group field-otinstrumententry-0-hrs_time">
<label class="control-label" for="otinstrumententry-0-hrs_time">Hrs-Time</label>
<input type="text" id="otinstrumententry-0-hrs_time" class="form-control" name="OtInstrumentEntry[0][hrs_time]" maxlength="255">

<div class="help-block"></div>
</div>      
            </div>
            <div class="col-md-2">     
            <div class="form-group field-otinstrumententry-0-total_charges">
<label class="control-label" for="otinstrumententry-0-total_charges">Total Charges</label>
<input type="text" id="otinstrumententry-0-total_charges" class="form-control" name="OtInstrumentEntry[0][total_charges]" maxlength="255">

<div class="help-block"></div>
</div>      
            </div>
                <div style="margin-top: 30px;" class="col-md-3 dnone" id="divDelete" class="row-fluid">           
    <a class="ft11 btn-remove" onclick="deleteSection(this, 'instrument_entry');"><span class="marleft18">Remove</span></a>               
    </div>  
</div>

    </div>

    <div class="row">
        <div class="col-md-12">
            <button type="button" class="btn btn-primary sec-btn marbtm10" onclick="addNewSection('instrument_entry', 'OtInstrumentEntry')">+ Add Instrument</button>
        </div>
    </div>

    <div class="row" style="margin-top: 20px;">
        <div class="col-md-12">
            <button type="submit" class="btn btn-success">Create</button>        </div>
    </div>

    </form> 

首先,您可以嘗試以下操作:

$this->registerJs("$(document).delegate('.form-control','change',function(event){
   sendAjax(this);
});");

function sendAjax(element)
{
    $.ajax({
        url: '".yii\helpers\Url::toRoute("ot-note/instrument1")."',
        dataType: 'json',
        method: 'GET',
        data: {id: $(element).val()},
        success: function (data, textStatus, jqXHR) {
            $('#otinstrumententry-0-instrument_code').val(data.instrument_code);

            },

         beforeSend: function (xhr) {
            alert('loading!');
         },
         error: function (jqXHR, textStatus, errorThrown) {
            console.log('An error occured!');
            alert('Error in ajax request');
        }
    });
}

現在,您可以在新添加的元素內添加onchange="sendAjax(this)" 我認為這種解決方案可以解決您的問題。

您的代碼中(在success處理程序中)只有一個硬編碼的值,所以我假設這就是問題的根源。 您可以使用.attr("id")獲取當前字段ID,使用正則表達式獲取數字並使用該數字生成選擇器:

    var currentId = $(this).attr("id");
    var generatedId = "";
    if ( currentId.match(/otinstrumententry-\d+-/) ) {
        generatedId = "#" + currentId.match(/otinstrumententry-\d+-/)[0]
                          + "instrument_code";
    }
    $.ajax({
        // ...
        success: function (data, textStatus, jqXHR) {
            if ( generatedId !== "" ) {
                $( generatedId ).val(data.instrument_code);
            }
        }
    });

另外,值得注意的您要在哪個元素上調用此處理程序。 從外觀上看,它似乎只是select ,但我不確定是否不了解業務邏輯:

$(document).delegate('select.form-control','change',function(event){
});

附帶說明一下,如果您使用的是jQuery 1.7或更高版本,則應將.delegate替換為其較新的版本.on 如果您使用的是舊版本,則應考慮對其進行更新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM