【问题标题】:Selecting first item, if initial value does not exist如果初始值不存在,则选择第一项
【发布时间】:2018-04-20 09:16:26
【问题描述】:

这里有我的组合框:

@(Html.Kendo().ComboBox()
    .Name("depots")
    .DataTextField("Text")
    .DataValueField("Value")
    .Height(500)
    .Filter(FilterType.Contains)
    .Events(ev =>
    {
        ev.Change("onDepotsChangeEvent");
        ev.DataBound("onDepotsDataBoundEvent");
        ev.Select("onDepotsSelectEvent");
    })
    .HighlightFirst(true)
    .Suggest(true)
    .Value(SOME INITIAL VALUE)
    .HtmlAttributes(new { style = "width:550px; max-width:100%;" })
    .DataSource(source => source.Custom()
        .Group(group => group.Add("Group", typeof(string)))
        .Transport(transport => transport
            .Read(read =>
            {
                // Censored ;)
            })
        )
    )
)

如您所见,我正在使用“.Value(something something”设置初始值。这意味着当组合框加载时,列表中与该值对应的项目被选中。它按预期工作正常.

问题是当没有与初始设定值对应的项目时。如果发生这种情况,初始值将显示在组合框的输入字段中。搜索了一下,这显然是设计使然,而不是错误。

我要做的是,如果组合框中不存在与初始设置值相同的项,则应选择列表中的第一项。

我已经搜索和搜索了几天,没有解决方案,所以任何帮助将不胜感激。

如果重要的话,这里是三个事件方法:

function onDepotsSelectEvent(e) {
    if (e.item) {
        var dataItem = this.dataItem(e.item.index());
        $.post("@Url.Action("SetSelectedDepotSession", "PartialView")", { id: dataItem.Value });
    }
}

function onDepotsChangeEvent(e)
{
    if (this.value() && this.selectedIndex === -1) {
        this._filterSource({
            value: "",
            field: this.options.dataTextField,
            operator: "contains"
        });
        this.select(1);
    }
}

function onDepotsDataBoundEvent(e)
{
    var widget = e.sender;

    if (widget.dataSource.view().length === 0) {
        widget.text("");
        widget.enable(false);
    }
}

解决方案

这是带有修复的数据绑定事件代码:

function onDepotsDataBoundEvent(e)
{
    var widget = e.sender;

    if (widget.dataSource.view().length === 0) {
        widget.text("");
        widget.enable(false);
    }

    if (widget.select() === -1) {
        widget.select(0);
    }
}

它的作用是,首先,如果根本没有项目,则组合框被禁用。然后,如果列表中不存在初始值,则选择列表中的第一项。

【问题讨论】:

    标签: javascript kendo-ui kendo-asp.net-mvc kendo-combobox kendo-ui-mvc


    【解决方案1】:

    是的,但这是一种奇怪的行为。就像小部件 添加 无效值到它的列表一样。我检查了如果您直接在输入元素中执行.val() 或在小部件实例中执行.value(),您会得到无效值,但如果您执行.select(),它会返回-1,因为没有相关的DataItem那个值。这是一个开始。

    如果.select() 返回-1,对我有用的是清除dataBound 事件上的小部件值。比如:

    if (this.select() == -1) {
        this.value(null);
    }
    

    Demo

    【讨论】:

    • 啊!那成功了!我确信解决方案是我忽略的小问题。我需要做更多的测试,也需要使用不同的浏览器,因为剑道在 Edge 和 Firefox 中的行为不同(嗯,至少是我使用的版本)。我使用了您的一段代码,但添加了一个选择,以选择列表中的第一项。我已经用解决方案更新了我的 OP。
    • @FrederikT 很高兴听到这个消息!剑道的发展都是关于小事情和技巧的哈哈
    • 是的,告诉我。确实是许多头痛的根源。尽管他们做得很好,但他们有同样数量的意大利面条代码并且缺乏文档。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多