如何动态初始化select2

时间:2015-10-07 04:56:12

标签: javascript php jquery ajax jquery-select2

我通过AJAX在DOM中插入了几行概念(带有select和input文本元素)。我想将那些选择初始化为select2:但我不知道正确的方法。

  • 我应该在每一行写javascript? (通过AJAX插入html和JS)

我在每个AJAX请求中都得到了这个:

<select id="concept0"> 
    <option value="Test"> Test </option>
    <option value="Test2"> Test 2 </option>    
</select>
<script> $("#concept0").select2(); </script>

但我认为在我的AJAX响应中使用HTML返回javascript是错误的想法。还有其他选择吗?

谢谢,对不起,如果我的问题有点愚蠢......

2 个答案:

答案 0 :(得分:3)

我会像这样构建流程:

  • 将partials分组选择以减少Ajax请求的数量
  • 使用'data - '
  • 将标记添加到部分HTML中
  • 使用AJAX GET检索部分html;
  • 初始化元素;
  • [可选]分离目标父元素 - 性能原因;
  • 将元素附加到目标;
  • [可选]重新附加目标元素;
  • 初始化小部件。

我在这里进行了模拟:http://jsbin.com/jotitu/edit?js,output

贝娄有点解释:

因此,假设您有以下HTML:

<div id="concept-table-container">
 <table>
   <tr>
     <th>
        No.
     </th>
     <th>
        Name.
     </th>
     <th>
        Option.
     </th>
   </tr>
   <tr>
     <td>1</td>
     <td>abc</td>
     <td></td>
   </tr>
   <tr>
     <td>2</td>
     <td>dce</td>
     <td></td>
   </tr>
   <tr>
     <td>3</td>
     <td>fgh</td>
     <td></td>
   </tr>
 </table>
</div>

对partials进行分组选择减少Ajax请求的数量,并使用'data - '

将标记添加到部分HTML中

如果您可以像这样分组和编写部分HTML,则无需对每行的Ajax请求执行此操作。您也可以选择限制它们,但这需要对“分页”进行更多编程。

<select data-widget="select2" data-row-idx="0"> 
    <option value="Test"> Test </option>
    <option value="Test2"> Test 2 </option>    
</select>
<select data-widget="select2" data-row-idx="1"> 
    <option value="Test"> Test </option>
    <option value="Test2"> Test 2 </option>    
</select>
<select data-widget="select2" data-row-idx="2"> 
    <option value="Test"> Test </option>
    <option value="Test2"> Test 2 </option>    
</select>

使用AJAX GET

检索部分html

我不会透露细节,这足以说明:

$.get(conceptPartialUrl, successCallback);

初始化元素;

var successCallback = function(data){
  var $fragmentEl = initEls(data);
  // Optionally before appending the selects detach the container;
  appendElements($fragmentEl, $containerEl);
  // Initialize the widgets.
  initSelect2Widgets();
};


var initEls = function(data){
  // Create DOM elements - JQuery Way
  var $fragmentEl = $(data);
  // Return the reference
  return $fragmentEl;
};

将元素附加到目标;

var appendElements = function($fragmentEl, $containerEl){
   var $rows = $containerEl.find('tr');
   $fragmentEl.each(function(){     
      var $el = $(this);


      // some matching - you 
      var idx = $el.data('row-idx');

      // that plus 1 is to skip the header        
      // find the row         
      var $row = $rows.eq(idx+1);         
      // find the cell, empty it and append the element  
      $row .find('td').last().text('').append($el);
   });
};

初始化小部件

var initSelect2Widgets = function(){
  $containerEl.find('[data-widget="select2"]').select2();
};

答案 1 :(得分:2)

我还有另一种方法:

正如您在评论中所说,您在每个ajax请求中发送一个计数器(我希望您使用该计数器生成select的id),您可以在ajax之前将其存储在某个元素或js变量中请求。因此,在每个ajax请求中,您都拥有该计数器的唯一值。

您可以使用以下方法初始化select2:

$(document).ajaxComplete(function() {
    $(document).find('your-unique-counter-select-id').select2();
});