在更新所选值时防止onChange事件触发

时间:2015-10-19 21:57:46

标签: jquery asp.net asp.net-mvc

我想知道是否有人可以在这里提供建议。使用MVC ASP.NET。我有一个htmlhelper ddl

      @Html.DropDownListFor(m => m.ddlStartTime, new SelectList(Model.StartTimes, "Text", "Value", ViewBag.selected), new { data_test = "true", @Class = "form-control", onchange = "SubmitDayViewer(this.id)" })

然后我有一个AJAX json请求,它获取并获取我的数据并返回部分视图以及其他一些json字符串数据。

    function SubmitDayViewer(pId) {
        var obj1 = { dateValue: $('#dteTester').val(), timeValue: $('#ddlStartTime').val(), callerID: pId };
        $.ajax({
            type: "POST",
            url: '@Url.Action("_ADayRoomViewerPartial", "Common")',
            data: obj1,
            datatype: "json",
            success: function (data) {
                  $("#ddlStartTime").select2("val", data.DDLTimeValue);
            }
        });
}

我无法克服的问题是,一旦我更改了所选值,就会阻止@ Html.DropDownListFor onChange事件触发。所以我最终陷入了无限循环。我需要设计一种只在用户更改实际ddl时触发事件的方法。手动不是当页面上的其他控件更新时,因此需要动态更改所选值而不触发事件。因此,在某些情况下,基本上不会发生变化。

1 个答案:

答案 0 :(得分:1)

使用off删除更改事件,然后使用on重新添加: -

function SubmitDayViewer() {
        var obj1 = { dateValue: $('#dteTester').val(), timeValue: $('#ddlStartTime').val(), callerID: this.id};
        $.ajax({
            type: "POST",
            url: '@Url.Action("_ADayRoomViewerPartial", "Common")',
            data: obj1,
            datatype: "json",
            success: function (data) {
                  $("#ddlStartTime").off('change', SubmitDayViewer);
                  $("#ddlStartTime").select2("val", data.DDLTimeValue);
                  $("#ddlStartTime").on('change', SubmitDayViewer);
            }
        });
}

另外,在函数中使用this而不是传入它。

修改

如果仍然发生这种情况,则select2必须以某种方式延迟该设置。因此,您可以查看插件代码以查看最新情况,或者您可以添加超时以重新添加更改事件。

$("#ddlStartTime").off('change', SubmitDayViewer);
$("#ddlStartTime").select2("val", data.DDLTimeValue);
window.setTimeout(function(){
    $("#ddlStartTime").on('change', SubmitDayViewer);
}, 2000); // 2 seconds

我个人会在插件中查找更清晰的解决方案。