销毁多选小部件

时间:2016-10-19 12:19:07

标签: javascript jquery kendo-ui kendo-multiselect

我想从Telerik's Kendo UI销毁并重新创建多选小部件。通常情况下,我之前做了很多次很容易,但从来没有多选。我现在面临的问题是应该起作用的方式(至少我认为应该这样)......不是。

以下是我用来销毁和重新创建网格或下拉列表等组件的代码:

if ($('#dropdown1').data('kendoDropDownList')) {
    $('#dropdown1').data('kendoDropDownList').destroy();
    $('#dropdown1').html('');
}

我怎么说 - 如果我在下拉列表或网格上使用它 - 它可以工作。但是在多选中却没有:

if ($('#multiselect1').data('kendoMultiSelect')) {
    $('#multiselect1').data('kendoMultiSelect').destroy();
    $('#multiselect1').html('');
}

我准备了小Dojo example,其中显示了行为。当下拉列表被销毁并重新创建时,它看起来是正确的。当我对Multiselect做同样的事情时,它总是将widget添加为下一行。

当然我可以通过更改dataSource来解决这个问题,只是调用read方法或类似的东西,但我想知道它是否是bug或者还有另一种方法来销毁多重选择。

感谢。

3 个答案:

答案 0 :(得分:6)

此代码使用unwrap()从kendo包装器div中删除原始输入,然后使用.remove()删除剩余的kendo DOM元素:

$('html').on('click', '#destroy2', function(e){
  if ($('#multiselect1').data('kendoMultiSelect')) {
    alert('multiselect exists - destroying and recreating');

    $('#multiselect1').data('kendoMultiSelect').destroy();
    $('#multiselect1').unwrap('.k-multiselect').show().empty();
    $(".k-multiselect-wrap").remove();

    $("#multiselect1").kendoMultiSelect({
      dataSource: {
        data: ["Three3", "Four4"]
      }
    });

    $('#text2').text('Multiselect AFTER calling destroy');
  }

});

答案 1 :(得分:1)

当您清除multiselect1的html时,它仍会留下将输入转换为窗口小部件时创建的所有其他dom元素。 然后当你重新创建它时,它并没有完全处理它以及下拉列表,我认为这可能是一个错误。

如果您改为包装需要在div元素中重新创建的控件并清除该元素,它将摆脱所有额外元素,以便您可以启动一个干净的平板来创建新的。

http://dojo.telerik.com/@Stephen/EDaYA

<div id='multiselectDiv'>
    <input id="multiselect1" />
</div>

$('html').on('click', '#destroy2', function(e){
  if ($('#multiselect1').data('kendoMultiSelect')) {
      alert('multiselect exists - destroying and recreating');

      $('#multiselect1').data('kendoMultiSelect').destroy();
      $('#multiselectDiv').empty();

      $('#multiselectDiv').append('<input id="multiselect1" />')
      $("#multiselect1").kendoMultiSelect({
      dataSource: {
         data: ["Three3", "Four4"]
      }
});

答案 2 :(得分:0)

我将您的代码更新为此内容并且有效:

$('html').on('click', '#destroy2', function(e){
  if ($('#multiselect1').data('kendoMultiSelect')) {
    alert('multiselect exists - destroying and recreating');
    var multiSelect = $('#multiselect1').data("kendoMultiSelect");
        multiSelect.value([]);
    $("#multiselect1").remove();
    $("#multiselect1").kendoMultiSelect({
      dataSource: {
        data: ["Three3", "Four4"]
      }
});

    $('#text2').text('Multiselect AFTER calling destroy');
  }
}); 

Use remove will work once