填充动态下拉列表,Codeigniter

bbmckpt7  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(147)

我尝试使用Codeigniter创建一个动态下拉列表,但在获取下一个下拉列表中的值时遇到了问题。当我在第一个下拉列表中选择一个选项时,第二个下拉列表没有填充:

我也不熟悉使用 AJAX ,我只写脚本的基础上,我搜索,所以请教我做什么,使动态下拉工作。
这是我的模型:

public function category()
{
    $this->db->order_by("category", "ASC");

    $query = $this->db->get('categories');
    return $query->result();
}

function get_subcategory($parent_id)
{
    $this->db->where('parent_id', $parent_id);
    $this->db->order_by('sub_category', 'ASC');
    $query = $this->db->get('sub_categories');
    $output = '<option value="">Select Sub-Category</option>';
    foreach ($query->result() as $row) {
        $output .= '<option value="' . $row['id'] . '">' . $row['sub_category'] . '</option>';
    }
    return $output;
}

我的控制器:

public function category()
{
    $data['title'] = 'List of Category';

    $this->load->view('../admin/template/admin_header');
    $this->load->view('../admin/template/admin_topnav');
    $this->load->view('../admin/template/admin_sidebar');
    $this->load->view('../admin/category/category', $data);
    $this->load->view('../admin/template/admin_footer');
}

function get_subcategory()
{
    if ($this->input->post('parent_id')) {
        echo $this->Admin_model->get_subcategory($this->input->post('parent_id'));
    }
}

查看方式:

<div class="form-group">
    <label for="" class="control-label">Category</label>
    <select name="category" id="category" class="custom-select select2" required>
        <option value="">- Select Category -</option>
        <?php
            foreach ($category as $row) {
                echo '<option value="' . $row->id. '">' . $row->category . '</option>';
            }
        ?>
    </select>
</div>
<div class="form-group">
    <label for="" class="control-label">Sub Category</label>
    <select name="sub_category" id="sub_category_id" class="custom-select select2" required>
        <option value="">- Select Sub Category -</option>
    </select>
</div>

和脚本:

$(document).ready(function() {
    $('#category').change(function() {
        var parent_id = $('#category').val();
        if (parent_id != '') {
            $.ajax({
                url: "<?php echo base_url(); ?>admin/get_subcategory",
                method: "POST",
                data: {parent_id:parent_id},
                success: function(data) {
                    $('#sub_category_id').html(data);
                }
            });
        } else {
            $('#sub_category_id').html('<option value="">Select Sub Category</option>');
        }
    });
});
kjthegm6

kjthegm61#

你的问题没有提到它,但是你的CSS提示你的select实际上是在使用Select2。当你初始化select作为Select 2时,它会复制初始的HTML,并添加样式和JS到它,你可以看到和与它交互。原始的HTML不再可见或使用。
因此,如果您稍后修改原始HTML,它将不会对您已经生成的Select 2产生任何影响,并且可以在页面上看到与的交互。
一种解决方案是在修改Select 2后重新初始化它。
更新
我已经添加了一个工作代码段,用一些硬编码的HTML来模拟 AJAX 返回的内容。单击运行来尝试。
第一个
注意事项:

  • Convention是在检索数据时使用GET,在修改数据时使用POST。你 AJAX 调用只是检索数据来显示,所以真的应该是GET;
  • 如果你打算多次使用jQuery选择器it makes sense to cache them.eg,在上面的代码中,你应该做如下操作:
let $category = $('#category');
let $sub = $('#sub_category_id');

// And then every time you need to use that selectors, use the variable, eg:
$category.select2();
$category.change(function ...
$sub.select2('destroy');
// etc
9q78igpj

9q78igpj2#

在你的成功回答中,写下这句话,并删除下面的“else”。

success: function(data) {
  $('#sub_category_id').append('<option value=>Select Sub Category</option>');
  for (var i=0; i<data.length; i++) { 
    $('#sub_category_id').append($('<option>', { 
      value: data[i].id,
      text : data[i].sub_category
    }));
  }
}

从控制器中获取数组中 AJAX 响应,然后像这样通过javascript运行它。
id是来自数据库的id,sub_category是来自数据库的sub_category
使用 AJAX 响应数组。

相关问题