将输入值保存在子行中-DataTables

Dan*_*eml 5 jquery datatables datatables-1.10

我在Form中响应数据DataTables在小型设备上生成子行。在这一行中,我有一些Input控件。这会导致两个问题。

第一个问题: 隐藏的子行中的值不会进入Form数据。

第二个问题: 编辑此输入后,值消失,并隐藏行。

有人可以帮我吗?

谢谢

更新资料

.DataTable()之前的简化tbody

<tbody>
    <tr>
        <td>System Architect</td>
        <td>Edinburgh</td>
        <td>61</td>
        <td>
            <input name="1" type="text"/>
        </td>
        <td>
            <input name="2" type="text"/>
        </td>
        <td>
            <input name="3" type="text" value="example"/>
        </td>
    </tr>               
</tbody>
Run Code Online (Sandbox Code Playgroud)

.DataTable()之后

<tbody>    
    <tr role="row" class="odd">
        <td class="sorting_1">System Architect</td>
        <td>Edinburgh</td>
        <td>61</td>
    </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

并扩展

<tbody>  
  <tr role="row" class="odd parent">
    <td class="sorting_1">System Architect</td>
    <td>Edinburgh</td>
    <td>61</td>              
  </tr>
  <tr class="child">
    <td class="child" colspan="3">
      <ul data-dtr-index="0">
        <li data-dtr-index="3">
          <span class="dtr-title">Age:</span>
          <span class="dtr-data">
            <input name="1" type="text" style="background-image: ; background-       attachment: scroll; background-position: 100% 50%; background-repeat: no-repeat;">
          </span>
         </li>
         <li data-dtr-index="4">
           <span class="dtr-title">Start date:</span>
           <span class="dtr-data">
             <input name="2" type="text"></span>
         </li>
         <li data-dtr-index="5">
           <span class="dtr-title">Salary:</span>
           <span class="dtr-data">
             <input name="3" type="text" value="example">
           </span>
         </li>
       </ul>
     </td>
  </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

所有简化的代码看起来都像小提琴

注解

对于我们的一些内部问题,我无法使用DataTables Ajax方法-这将非常缓慢并且违反了应用程序逻辑。这就是为什么我试图通过经典形式从DataTable传递数据。

Gyr*_*com 5

解决方案

下面不是一个理想的解决方案,但至少它是有效的。我还没有测试隐藏的表单元素,而且这个解决方案也不适用于同一单元格中的多个表单元素。

您需要使用columnDefs定位包含表单元素的所有列,并使用render选项定义一个函数,该函数将返回包含当前表单字段值的 HTML。这对于在子行中呈现正确的表单字段是必要的。

此外,当用户更改子行中表单字段的值时,需要更新父表单字段。

$(document).ready(function (){
   var table = $('#example').DataTable({
      'columnDefs': [
         {
            'targets': [1, 2, 3, 4, 5],
            'render': function(data, type, row, meta){
               if(type === 'display'){
                  var api = new $.fn.dataTable.Api(meta.settings);

                  var $el = $('input, select, textarea', api.cell({ row: meta.row, column: meta.col }).node());

                  var $html = $(data).wrap('<div/>').parent();

                  if($el.prop('tagName') === 'INPUT'){
                     $('input', $html).attr('value', $el.val());
                     if($el.prop('checked')){
                        $('input', $html).attr('checked', 'checked');
                     }
                  } else if ($el.prop('tagName') === 'TEXTAREA'){
                     $('textarea', $html).html($el.val());

                  } else if ($el.prop('tagName') === 'SELECT'){
                     $('option:selected', $html).removeAttr('selected');
                     $('option', $html).filter(function(){
                        return ($(this).attr('value') === $el.val());
                     }).attr('selected', 'selected');
                  }

                  data = $html.html();
               }

               return data;
            }
         }
      ],
      'responsive': true
   });

   // Update original input/select on change in child row
   $('#example tbody').on('keyup change', '.child input, .child select, .child textarea', function(e){
       var $el = $(this);
       var rowIdx = $el.closest('ul').data('dtr-index');
       var colIdx = $el.closest('li').data('dtr-index');
       var cell = table.cell({ row: rowIdx, column: colIdx }).node();
       $('input, select, textarea', cell).val($el.val());
       if($el.is(':checked')){ $('input', cell).prop('checked', true); }
   });
});
Run Code Online (Sandbox Code Playgroud)

演示

有关代码和演示,请参阅此 jsFiddle

链接