简体   繁体   English

使用 SelectPicker 动态添加行

[英]Add Row dynamically with SelectPicker

Morning,早晨,

I have a table with selectpicker in first column.我在第一列有一个带有 selectpicker 的表。 and i would like to add dynamically rows.我想动态添加行。 Actually after adding row first column it's ok but i can't select for second column.实际上,在添加第一行之后就可以了,但我不能 select 用于第二列。 Thks for your help.谢谢你的帮助。

My table:我的桌子:

<tbody>
    <tr>
        <td>
            <Select class="selectpicker" name="item_desc[]" id="item_desc" type="integer" onchange="select_fields(this)">
                <option> </option>
                @foreach ($articles as $article)
                    <option>{{$article->id}}</option>
                @endforeach
            </Select>
        </td>
        <td class="writefields" name="item_fields[]"></td>
        <td><i class="btn far fa-trash-alt" onclick="remove_row(this)"></i></td>
    </tr>
</tbody>

` `

My function to add row:我的 function 添加行:

function add_row(){
     var root = document.getElementById('add_table').getElementsByTagName('tbody')[0];
     var rows = root.getElementsByTagName('tr');
     var clone = cloneEl(rows[rows.length -1]);
     cleanUpInputs(clone);
     root.appendChild(clone);
 }

 function cloneEl(el){
     var clo = el.cloneNode(true);
     return clo;
 }

 function cleanUpInputs(obj){
     for (var i = 0; n = obj.childNodes[i]; ++i){
         if(n.childNodes && n.tagName != 'INPUT'){
             cleanUpInputs(n);
         }else if (n.tagName == 'INPUT' && n.type == 'text') {
             n.value = '';
         }
     }
 }

My select_fields function:我的 select_fields function:

function select_familyfields(e)
{
    ...
    var selectionfamille = e.value;

  $.ajax({
            type: "POST",
            url: "/achats/selection",
            data: {_token: CSRF_TOKEN, code_item : selection },
            dataType: "JSON",
            success: function (data) {       $(e).parents('tr').find('.item_fields[]').text(data.natureachat.LibNatureAchat); 
          ...
        }
    });
}

You are using selectpicker in your code so this plugin creates its own dynamic htmls and assign ids,data-attribute to them so when you clone your tr they are copy as well that's why you don't see option inside newly added dropdown nor they are able to selected.您在代码中使用 selectpicker,因此此插件创建自己的动态 html 并为其分配ids,data-attribute ,因此当您克隆tr 时,它们也是副本,这就是为什么您在新添加的下拉列表中看不到选项,也不是它们能够选择。

Instead, one way to make this work is to store cloned tr in some variable where selectpicker is not yet initialize.相反,实现这项工作的一种方法是将克隆的 tr 存储在selectpicker尚未初始化的某个变量中。 Then, whenever add_row() function is call simply use that cloned tr to append inside your tbody and then intialize your selectpicker using $("#add_table tbody tr:last select").selectpicker() .然后,每当add_row() function 时,只需在您的tbody中使用克隆的 tr 到 append ,然后使用$("#add_table tbody tr:last select").selectpicker()初始化您的选择器。

Demo Code :演示代码

 var cloned = $("#add_table tbody tr:first").clone() //keep clone for later use.. $("select[name*=item_desc]").selectpicker() //intialize your slectpicker function add_row() { $(cloned).find("input").val("") //empty any input.. $(cloned).find(".writefields").text("") //clear td $("<tr>" + $(cloned).html() + "</tr>").appendTo($("#add_table tbody")) //append to your tbody.. $("#add_table tbody tr:last select").selectpicker() //intialize newly added selct... } function select_fields(e) { var selectionfamille = e.value; console.log(selectionfamille) /* $.ajax({ type: "POST", url: "/achats/selection", data: { _token: CSRF_TOKEN, code_item: selection }, dataType: "JSON", success: function(data) {*/ //just for demo... $(e).parents('tr').find('[name="item_fields[]"]').text("abcxyz") //data.natureachat.LibNatureAchat; /*} });*/ }
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/css/bootstrap-select.min.css"> <script src="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/js/bootstrap-select.min.js"></script> <table id="add_table"> <tbody> <tr> <td> <.--remove selectpicker class and id..--> <select name="item_desc[]" onchange="select_fields(this)"> <option> </option> <option>1</option> <option>2</option> </select> </td> <td class="writefields" name="item_fields[]">Smethings...</td> <td><i class="btn far fa-trash-alt" onclick="remove_row(this)">Delete</i></td> </tr> </tbody> </table> <button onclick="add_row()">Add</button>

Maybe it is because your <Select element has an ID and you need to make that unique?也许是因为你的<Select元素有一个 ID,你需要让它唯一? Try this addition to your cleanUpInputs function尝试将此添加到您的cleanUpInputs function

function cleanUpInputs(obj){
     let cloneCounter = document.getElementById('add_table').getElementsByTagName('tbody').length + 1
     obj.getElementsByClassName('.selectpicker')[0].id = "item_desc" + cloneCounter;
     for (var i = 0; n = obj.childNodes[i]; ++i){

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM