【问题标题】:Laravel multiple rows of dynamic dropdownsLaravel 多行动态下拉列表
【发布时间】:2016-07-01 13:21:56
【问题描述】:

所以在我的 laravel 视图中,我有一排三个下拉菜单、类别、供应商和产品,它们会根据用户的选择动态填充。

<fieldset>
    <legend>Products</legend>

    <div id="invoice-line-item" class="row row-eq-height">
        <div class="col-md-2">
            <div class="form-group">

                {{ Form::label('category', "Category", array('class' => 'col-xs-3 control-label')) }}

                <select name="category" id="category" class="form-control" >
                    <option value="none">Select a category</option>
                        @foreach($categories as $id => $name)
                            <option value="{{ $id }}">{{ $name }}</option>
                        @endforeach
                </select>
            </div>
        </div>

        <div class="col-md-2">
            <div class="form-group">
                {{ Form::label('supplier', "Supplier", array('class' => 'col-xs-3 control-label')) }}
                <select name="supplier" id="supplier" class="form-control"></select>
            </div>
        </div>

        <div class="col-md-2">
            <div class="form-group">
                {{ Form::label('product', "Product", array('class' => 'col-xs-3 control-label')) }}
                <select name="product" id="product" class="form-control"></select>
            </div>
        </div>  

        <div class="col-md-2">
            <div class="form-group">
                {{ Form::label('quantity', 'Quantity', array('class' => 'col-xs-3 control-label')) }}
                {{ Form::number('quantity', '', array('class' => 'form-control')) }}
            </div>
        </div>

        <div class="col-md-2" style="align-self:center;">
            <button type="button" class="btn btn-xs btn-danger remove-invoice-item">Remove</button>
        </div>

    </div>

    <div class="row">
        <div class = "col-md-12">
            <div class="form-group">
                <a href="#" id="add-invoice-item" class="btn btn-sm btn-info">Add Item</a>
            </div>
        </div>
    </div>

</fieldset>


jQuery处理动态人口:

<script>
    $('#category').change(function() {
            $.get("{{ url('loadSuppliers') }}", { selectedCategory: $("#category").val() }, function(data) {
                $("#supplier").empty();
                $("#product").empty();

                if (data) {
                    $("#supplier").append("<option value='none'>Select a supplier</option>");

                    $.each(data, function(key, value) {
                        $("#supplier").append("<option value = '" + key + "'>" + value + "</option>");
                    });
                }
            });
        });

        $("#supplier").change(function() {
            $.get("{{ url('loadProducts') }}", { selectedSupplier: $("#supplier").val() }, function(data) {
                $("#product").empty();

                if (data) {
                    $("#product").append("<option value='none'>Select a product</option>");

                    $.each(data, function(key, value) {
                        $("#product").append("<option value = '" + key + "'>" + value + "</option>");
                    });
                }
            });
        });
</script>


追加行的jQuery:

var invoice_line_item_template = 
            '<div id="invoice-line-item" class="row row-eq-height">' +
                '<div class="col-md-2">' +
                    '<div class="form-group">' +

                        '{{ Form::label('category', "Category", array('class' => 'col-xs-3 control-label')) }}' +

                        '<select name="category" id="category" class="form-control" >' +
                            '<option value="none">Select a category</option>' +
                            '@foreach($categories as $id => $name)' +
                                '<option value="{{ $id }}">{{ $name }}</option>' +
                            '@endforeach' +
                        '</select>' +
                    '</div>' +
                '</div>' +

                '<div class="col-md-2">' +
                    '<div class="form-group">' +
                        '{{ Form::label('supplier', "Supplier", array('class' => 'col-xs-3 control-label')) }}' +
                        '<select name="supplier" id="supplier" class="form-control"></select>' +
                    '</div>' +
                '</div>' +

                '<div class="col-md-2">' +
                    '<div class="form-group">' +
                        '{{ Form::label('product', "Product", array('class' => 'col-xs-3 control-label')) }}' +
                        '<select name="product" id="product" class="form-control"></select>' +
                    '</div>' +
                '</div>' +

                '<div class="col-md-2">' +
                    '<div class="form-group">' +
                        '{{ Form::label('quantity', 'Quantity', array('class' => 'col-xs-3 control-label')) }}' +
                        '{{ Form::number('quantity', '', array('class' => 'form-control')) }}' +
                    '</div>' +
                '</div>' +

                '<div class="col-md-2" style="align-self:center;">' +
                    '<button type="button" class="btn btn-xs btn-danger remove-invoice-item">Remove</button>' +
                '</div>' +                              
            '</div>';           


        $('#add-invoice-item').on('click', function(e) {
            e.preventDefault();

            $(this).before(invoice_line_item_template);
        });

        $(document).on('click', '.remove-invoice-item', function(e){
            e.preventDefault();

            $(this).parents('#invoice-line-item').remove();
        });

3 个下拉菜单的第一行的动态填充通过 jQuery 作为例外动态填充。

但是,我还具有这样的功能,即当用户单击添加项目按钮时,会附加另外一行 3 个下拉菜单。换句话说,另一个发票行项目。但是,因为它们都使用相同的 ID、#category、#supplier 和 #product,所以第一行之后的后续行不会按预期动态填充。当我提交表单并保存到数据库时,我也不知道如何在控制器中处理这些具有相同 ID 的多个下拉列表。我应该如何处理这个问题?

【问题讨论】:

  • 将 $('#category').change(function() { 更改为 $('[name=category]').on('change', function() { 类似地 $("#供应商").change(function() { 到 $("[name=supplier]").change(function() { 这是因为 id 对于 dom 中的每个元素都应该是唯一的
  • 刚试过这个,但仍然是同样的问题。 3 个下拉列表的第一行会正确动态填充。当我单击添加项目按钮并显示另一行下拉列表时,就会出现问题,所有下拉列表都与第一个具有相同的名称和 ID。以下行不会动态填充。
  • 你能把你的东西放在 jsfiddle 上进行现场演示吗?
  • 我不确定如何进行 jsfiddle 现场演示,因为在控制器中从数据库中查询了类别、供应商和产品...,但我上传了一张图片以更好地说明情况。
  • 如何添加另一行下拉菜单?也包括该代码

标签: php jquery laravel


【解决方案1】:

事实证明,我需要一个计数器来为每个元素创建唯一的 id,然后为每个元素附加单独的侦听器,以便它们都可以单独操作。

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2020-04-13
    • 2018-04-20
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多