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

如何在一个AJAX函数中获取仓库、商品分类数据填充下拉选择框

问题解答

首先明确三个核心疑问的结论:

  • 单个AJAX请求不能同时指定两个URL,每一个AJAX实例只能对应一个请求地址
  • 你可以选择两种实现方案:要么后端调整接口同时返回商品分类+仓库数据,仅发一次请求;要么分别调用两个接口获取对应数据
  • 不需要强行在同一个AJAX配置里写两个URL,推荐要么合并接口,要么用jQuery自带的$.when方法并发两个请求,逻辑更清晰

方案1:合并接口(推荐,性能最优)

后端调整原有接口或者新增一个统一拉取基础数据的接口,返回格式同时包含两张表的数据:

接口返回示例:

{
  "item_categories": {"电子类":1, "服饰类":2},
  "warehouses": {"上海仓":101, "广州仓":102}
}

对应前端代码修改如下(同时修正了你原有代码里的HTML语法错误:标签未闭合、id重复、多余结束标签等问题):

$(function () {
  var i = 0;
  $("#add-more-item").click(function () {
    ++i;
    $.ajax({
      type:"GET",
      url:"/admin-master/get_base_item_data", // 替换为合并后的接口地址
      dataType: 'JSON',
      success:function(res){
        // 生成商品分类选项
        let categoryOption = '<option>-- Pilih Ketegori --</option>';
        $.each(res.item_categories,function(itemcategory_name,id_item_category){
          categoryOption += `<option value="${id_item_category}">${itemcategory_name}</option>`
        });
        // 生成仓库选项
        let warehouseOption = '<option>-- Pilih Gudang --</option>';
        $.each(res.warehouses,function(warehouse_name,id_warehouse){
          warehouseOption += `<option value="${id_warehouse}">${warehouse_name}</option>`
        });
        // 插入新增行
        $(".add-more").append(`
          <tr>
            <td><select class="form-control" name="warehouse_id[${i}]" required>${warehouseOption}</select></td>
            <td><input type="text" name="item_code[${i}]" class="form-control" placeholder="Kode Barang" required></td>
            <td><select class="form-control" name="itemcategory_id[${i}]" required>${categoryOption}</select></td>
            <td><input type="text" name="item_name[${i}]" class="form-control" placeholder="Nama Barang" required></td>
            <td><input type="text" name="item_weight[]" class="form-control" placeholder="Contoh : 200 kg" required></td>
            <td><input type="text" name="item_height[]" class="form-control" placeholder="Contoh : 200 cm" required></td>
            <td><input type="number" name="item_qty[]" class="form-control" placeholder="Contoh : 200 " required></td>
            <td><input type="text" name="description[]" class="form-control" placeholder="Keterangan Barang"></td>
            <td align="center"><button type="button" class="remove-item btn btn-danger btn-md"><i class="fas fa-trash-alt"></i></button></td>
          </tr>
        `);
      }
    });
  });
  // 补充删除行逻辑
  $(document).on('click', '.remove-item', function() {
    $(this).closest('tr').remove();
  });
});

方案2:不修改后端,并发两个请求

如果不想调整后端接口,可以先新增一个拉取仓库数据的接口,用$.when同时发起两个请求:

$(function () {
  var i = 0;
  // 页面初始化就拉取一次基础数据,不用每次新增都发请求,性能更好
  let categoryData = null, warehouseData = null;
  $.when(
    $.getJSON("/admin-master/get_item_category"),
    $.getJSON("/admin-master/get_warehouse") // 后端新增的获取仓库数据的接口
  ).done(function(categoryRes, warehouseRes){
    categoryData = categoryRes[0];
    warehouseData = warehouseRes[0];
  });

  $("#add-more-item").click(function () {
    ++i;
    // 直接用预加载的数据生成选项
    let categoryOption = '<option>-- Pilih Ketegori --</option>';
    $.each(categoryData,function(itemcategory_name,id_item_category){
      categoryOption += `<option value="${id_item_category}">${itemcategory_name}</option>`
    });
    let warehouseOption = '<option>-- Pilih Gudang --</option>';
    $.each(warehouseData,function(warehouse_name,id_warehouse){
      warehouseOption += `<option value="${id_warehouse}">${warehouse_name}</option>`
    });
    // 插入行的逻辑和方案1完全一致,此处省略
  });
});

优化建议

不要每次点击新增行都发起接口请求,页面初始化时一次性拉取商品分类、仓库这类不常变动的基础数据存为全局变量,新增行时直接用变量生成选项即可,减少不必要的服务端请求。

内容的提问来源于stack exchange,提问作者mfahmifadh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:04