填充动态下拉列表,Codeigniter

Populate dynamic dropdown, Codeigniter

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

我也不熟悉使用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>');
        }
    });
});

你的问题没有提到它,但你的 CSS 表明你的 select 实际上正在使用 Select2。当您将 select 初始化为 Select2 时,它会复制初始 HTML,并向其添加样式和 JS,这是您看到并与之交互的副本。原来的 HTML 不再可见或根本无法使用。

因此,如果您以后来修改原始 HTML,它将不会影响您已经生成的 Select2,并且可以在页面上看到与之交互。

一个解决方案是在修改后重新初始化 Select2。

更新

我已经添加了一个工作片段,其中有一些 hard-coded HTML 来模拟您的 AJAX returns。点击运行试一试

$(document).ready(function () {
    
    // Initialise Select2s
    $('.select2').select2();
    
    // Fake HTML, simulate what your AJAX returns
    let fakedHTMLResponse = '<option value="water">Water</option><option value="juice">Juice</option><option value="beer">Beer</option>';
    
    $('#category').change(function () {
        var parent_id = $('#category').val();
        // console.log('parent_id', parent_id);
        
        if (parent_id != '') {
            // Your AJAX call happens here, let's simulate the success
            // response it gets back, and handle it the same way.
            $('#sub_category_id').select2('destroy')
                .html(fakedHTMLResponse)
                .select2();

        } else {
            $('#sub_category_id').html('<option value="">Select Sub Category</option>');
        }
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>

<select id="category" class="select2" name="food">
    <option value="">- Select Category -</option>
    <option value="fruits">Fruits</option>
    <option value="vegetables">Vegetables</option>
    <option value="cakes">Cakes</option>
</select>

<select id="sub_category_id" class="select2" name="drink">
    <option value="">- Select Sub Category -</option>
</select>

注:

  • Convention是获取数据时使用GET,更改数据时使用POST。您的 AJAX 调用只是检索要显示的数据,因此实际上应该是 GET;

  • 如果您要多次使用 jQuery 选择器,it makes sense to cache them。例如在上面的代码中你应该做这样的事情:

    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
    

在您的成功回复中写下这个并从下面删除其他内容。

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 响应数组。