You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kendo DropDownList(DDL)Change事件触发不一致问题求助

我碰到过类似的Kendo DropDownList绑定Change事件失效的情况,先把问题梳理清楚,再聊聊可能的原因和解决思路:

问题详情

我创建了两个绑定Change事件的Kendo下拉列表(DDL),出现了诡异的触发差异:

  • 其中一个DDL的事件触发完全正常,但另一个DDL的事件毫无反应,控制台也没有报错
  • 测试发现:如果把失效DDL的事件指向不存在的函数,控制台会正常报错;但指向已存在的函数时就没任何动静
  • 目前临时解决办法是:直接给Kendo DDL对应的底层文本输入框绑定原生onchange事件

正常工作的DDL代码

<span class="wideitemtitle">Working DDL:</span>
@Html.Kendo().DropDownListFor(m => m.WorkingDDLID)
    .DataValueField("ID")
    .DataTextField("Text")
    .BindTo(Model.DDLWorking)
    .OptionLabel("Select Working DDL")
    .HtmlAttributes(new { style = "width:300px;" })
    .Events(ev => ev.Change("workingDDLChanged"))

无法触发事件的DDL代码

<span class="wideitemtitle">Broken DDL:</span>
@Html.Kendo().DropDownListFor(m => m.BrokenDDLID)
    .DataValueField("ID")
    .DataTextField("Text")
    .BindTo(Model.DDLBroken)
    .OptionLabel("Select Broken DDL")
    .HtmlAttributes(new { style = "width:300px;" })
    .Events(ev => ev.Change("brokenDDLChanged"))

绑定的事件函数(仅做日志输出)

function workingDDLChanged(e) { 
    console.log('in workingDDLChanged'); 
}
function brokenDDLChanged(e) { 
    console.log('in brokenDDLChanged'); 
}

临时解决代码

$(document).ready(function () { 
    document.getElementById('WorkingDDLID').onchange = brokenDDLChanged; 
});

注:WorkingDDLID是Kendo DDL对应的底层文本输入框ID

可能的原因与更规范的修复方案

  1. 脚本加载顺序排查:虽然指向不存在的函数会报错,但可以确认下brokenDDLChanged函数的定义是否在Kendo DDL初始化脚本之后——如果函数定义在后,控件初始化时可能无法正确绑定(不过你的测试结果大概率排除了这个,但还是可以检查下)
  2. 控件初始化冲突检查:查看页面中是否存在重复的BrokenDDLID元素,或者有没有其他脚本重新初始化了这个DDL,覆盖了原本的事件绑定
  3. 用Kendo原生方式重新绑定事件:替代临时的底层输入框绑定,直接获取Kendo控件实例重新绑定事件,更符合框架规范:
$(document).ready(function() {
    // 获取失效DDL的Kendo控件实例
    var brokenDDL = $("#BrokenDDLID").data("kendoDropDownList");
    // 重新绑定Change事件
    brokenDDL.bind("change", function(e) {
        console.log('in brokenDDLChanged');
        // 这里可以直接写业务逻辑,或者调用你的brokenDDLChanged函数
        // brokenDDLChanged(e);
    });
});
  1. Model数据格式校验:确认Model.DDLBroken的数据结构、内容是否和Model.DDLWorking完全一致——比如是否存在空值、数据类型不匹配等问题,导致控件初始化异常,间接影响事件触发

内容的提问来源于stack exchange,提问作者Legion

火山引擎 最新活动