如果初始值不存在,请选择第一项

时间:2018-04-20 09:16:27

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

这里有我的组合框:

@(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(某事物”)设置初始值。这意味着当组合框加载时,列表中与该值对应的项目将被选中。它可以正常工作

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

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

我已经搜索并搜索了几天,没有任何解决方案,所以任何帮助都将非常感谢。

如果重要,以下是三种事件方法:

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);
    }
}

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

1 个答案:

答案 0 :(得分:1)

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

对我而言,如果dataBound返回.select(),则清除小工具在-1事件中的值。类似的东西:

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

Demo