You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:51