【问题标题】:Destroying multiselect widget销毁多选小部件
【发布时间】:2016-10-19 12:19:06
【问题描述】:

我想从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,其中显示了行为。当下拉列表被销毁并重新创建时,它看起来是正确的。当我对多选执行相同操作时,它总是将小部件添加为下一行。

当然,我可以通过更改 dataSource 并调用 read 方法或类似的方法来解决这个问题,但我想知道它是错误还是有另一种方法来破坏多选。

谢谢。

【问题讨论】:

    标签: javascript jquery kendo-ui kendo-multiselect


    【解决方案1】:

    此代码使用 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');
      }
    

    });

    【讨论】:

    • 谢谢,这个解决方案对我来说看起来最方便。
    • @Ademar,不客气。这似乎是 KendoUI 中的一个错误。我希望 destroy() 能让你回到原来的标记......
    • .destroy() 不会摆脱任何小部件的包装元素(甚至是本示例中的 DropDownList)。只是 MultiSelect 似乎没有处理已经存在的包装器以及其他小部件。 .destroy() 确实 删除“分离”标记(弹出窗口等)...出于某种原因,ContextMenu 除外。
    【解决方案2】:

    当你清除 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"]
          }
    });
    

    【讨论】:

    • 谢谢,它有效,但@ezanker 的解决方案更适合我,因为如果没有必要,我不想创建包装器 div..
    【解决方案3】:

    我将你的代码更新为这个并且它可以工作:

    $('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

    【讨论】:

    • 你应该仔细检查你的答案......它不起作用
    • 你好@MisterPositive,谢谢你的回答。您能否将其直接更新为 dojo 示例?因为当我使用您的代码时,它会因为 _ $('#multiselect1').kendoMultiSelect.destroy();_ 行而崩溃,如您所见 here。也许我错过了一些东西,但我无法让它发挥作用。谢谢。
    • 好吧,在您提供的示例中,它在同一行崩溃。如果您检查控制台错误日志,您将看到 Uncaght TypeError。此外,如果您检查多选中的项目,仍然有旧选项。
    猜你喜欢
    • 2018-07-05
    • 2011-07-24
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2023-01-13
    • 2016-03-22
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多