问题是当结合使用Kendo UI Dropdownlist和dataBound方法设置加载时的选定值时。

在DataBound方法中设置该值的原因是为了确保传输返回了dropdownlist的数据项,以防止争用条件失败。下面的静态示例中没有对此进行演示,但是我的数据集来自传输服务器端调用。

设置下拉列表的选项过滤器:“startswith”对于简单的客户端过滤非常有效,但是由于使用dataBound会出现问题。关于此问题的文档很少,但是当初始化dropdownlist以及任何对它采取包括过滤在内的方法时,都会调用dataBound。

通过将调试器放置在检查器工具中,我可以观察到filter方法的工作情况,然后再次击中dataBound方法并将其设置为初始化值。结果是看起来过滤器完全失败了。

请参见以下示例。要重现该问题,请尝试使用下拉列表的过滤器功能,键入“Apple”并观察会发生什么。

$("#dropdownlist").kendoDropDownList({
  dataSource: ["Apples", "Oranges"],
  filter: "startswith",
  dataBound: function(e) {
    $("#dropdownlist").data('kendoDropDownList').value("Oranges");
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.3.914/js/kendo.all.min.js"></script>
<link href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.nova.min.css" rel="stylesheet" />
<link href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.common.min.css" rel="stylesheet" />

<input id="dropdownlist" />


我需要一种方法使dataBound仅在初始化时触发,或者使过滤器不再传播,从而避免过滤后的dataBound调用。

最佳答案

在研究了DOM中的下拉列表之后,我发现了一个解决方案,尽管可能有点棘手,但它允许dataBound在传输加载列表之后初始化并设置值,并防止其劫持filter方法。

$("#dropdownlist").kendoDropDownList({
  dataSource: ["Apples", "Oranges"],
  filter: "startswith",
  dataBound: function(e) {
    if (e.sender.filterInput.val() === "") {
      $("#dropdownlist").data('kendoDropDownList').value("Oranges");
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//kendo.cdn.telerik.com/2016.3.914/js/kendo.all.min.js"></script>
<link href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.nova.min.css" rel="stylesheet" />
<link href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.common.min.css" rel="stylesheet" />

<input id="dropdownlist" />


通过使用条件检查包装dataBound初始化逻辑,以查看输入的过滤器值(filterInput)是否为将在初始化时使用的空字符串,它允许过滤器的任何后续使用都绕过dataBound逻辑。

如果您有任何其他见解或更好的解决方案,请发表。

10-07 13:44