Yii2 Kartik DepDropdown二级下拉列表无法加载问题求助
解决Kartik DepDropdown无法加载城市数据的问题
我来帮你排查这个问题!从你提供的接口返回数据、视图和控制器代码来看,核心问题出在接口返回的数据格式不符合DepDropdown组件的预期,另外还有几处细节需要确认调整:
1. 修正接口返回的数据格式
Kartik DepDropdown默认期望output字段是包含id和name键的对象数组,而你当前返回的是关联数组(键为ID,值为城市名称),组件无法正确解析这种格式。
修改控制器代码:
把actionLoadCities中获取城市数据的部分转换成组件需要的格式:
public function actionLoadCities() { $out = []; if (isset($_POST['depdrop_parents'])) { $parents = $_POST['depdrop_parents']; if ($parents != null) { $region_id = $parents[0]; // 获取原始关联数组格式的城市数据 $cities = City::getAllCities($region_id); // 转换成DepDropdown需要的对象数组格式 foreach ($cities as $id => $name) { $out[] = ['id' => $id, 'name' => $name]; } echo Json::encode(['output' => $out, 'selected' => '']); return; } } echo Json::encode(['output' => [], 'selected' => '']); }
修改后接口返回的JSON应该是这样的结构:
{ "output": [ {"id": "40", "name": "Велико Търново"}, {"id": "41", "name": "Горна Оряховица"}, {"id": "42", "name": "Елена"}, ... ], "selected": "" }
2. 确认下拉框ID的一致性
你在问题描述中提到目标下拉框ID是city_id,但视图里DepDropdown的配置写的是'id'=>'city-id'(短横线),虽然这不一定是直接原因,但为了避免混淆,建议统一ID命名:
<?= $form->field($model, 'city_id')->widget(DepDrop::classname(), [ 'options'=>[ 'id'=>'city_id' // 改成下划线,和描述中的ID一致 ], 'pluginOptions'=>[ 'allowClear' => true, 'depends' => ['region-dd'], 'url' => Url::to(['/system-information/load-cities']) ] ]); ?>
3. 检查前端控制台错误
打开Chrome开发者工具的控制台(Console),查看是否有JavaScript报错(比如DepDropdown插件初始化失败、JSON解析错误等),这能帮你快速定位其他潜在问题。
完成以上调整后,刷新页面重新测试,应该就能正常加载城市数据了!
内容的提问来源于stack exchange,提问作者Toma Tomov
相关产品推荐
相关产品推荐

