由于onchange函数,yii2依赖下拉列表重置编辑操作

时间:2016-01-04 09:13:30

标签: yii2 onchange cascadingdropdown

摘要

在编辑操作中,下拉列表应显示现有值,但正由(看似)无关的onchange事件清除。

详情

在Yii2表单中,我有2个依赖的下拉列表。制作和模型。当触发make的onchange事件时,模型下拉列表会发生变化。

<?php
    echo $form->field($model, 'make_id')->dropDownList(ArrayHelper::map(Make::find()->all(),'make_id','description'), 
        ['prompt'=>'-Choose a Make-',
        'onchange'=>'
            $.post( "'.Yii::$app->urlManager->createUrl('/equipmentmodel/selectlist?id=').'"+$(this).val(), function( data ) {
                $( "select#equipmentmodel" ).html( data );
        });
    ']);
 ?>

 <?php
    echo $form->field($model, 'model_id')->dropDownList(ArrayHelper::map(EquipmentModel::find()->all(),'model_id','description'),
        ['id'=>'equipmentmodel']
    );
 ?>

基于make选择的模型更新工作正常。

我现在添加了一个JS代码,该代码在第二个下拉列表的onchange事件上被触发,即模型。

$script = <<< JS

$(document).ready(function(){
    $("#equipment-make_id").change(function(){

        $(this).find("option:selected").each(function(){
            if($(this).attr("value")=="$laptopType"){
                $(".equipment_additional_attributes").not("#laptop_additional_attributes").hide();
                $("#laptop_additional_attributes").show();
            }
            else if($(this).attr("value")=="$desktopType"){
                $(".equipment_additional_attributes").not("#desktop_additional_attributes").hide();
                $("#desktop_additional_attributes").show();
            }
            else{
                $(".equipment_additional_attributes").hide();
            }
        });

        return false;

    }).change();
});

JS;

$this->registerJs($script);
?>

这个onchange事件处理程序的存在导致$(&#34;#equipment-make_id&#34;)重置,我看不清楚原因。从处理程序内部删除所有代码,或者甚至(仅)返回false会导致重置值。

如果我从源代码中删除事件处理函数,则第二个下拉列表的值保持不变。

选项的选定属性设置正确,如果我查看页面源代码,我可以看到这一点。

我需要保留第二个下拉列表的值,但我不确定如何,

1 个答案:

答案 0 :(得分:0)

我发现了问题。在onchange处理程序上存在了额外的更改。

$(document).ready(function(){
    $("#equipment-make_id").change(function(){
      // ...code here
    }).change();  // <=== THIS WAS causing the problem
});