Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果初始值不存在,则选择第一项_Javascript_Kendo Ui_Kendo Asp.net Mvc_Kendo Combobox_Kendo Ui Mvc - Fatal编程技术网

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

Javascript 如果初始值不存在,则选择第一项,javascript,kendo-ui,kendo-asp.net-mvc,kendo-combobox,kendo-ui-mvc,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

这是我的组合框:

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

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

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

对我来说,如果
.select()
返回
-1
,则清除
数据绑定
事件中小部件的值。类似于:

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

Ah!这就成功了!我确信解决方案是我忽略的次要问题。我需要做更多的测试,还需要使用不同的浏览器,例如在Edge和Firefox中kendo的行为不同(至少是我使用的版本)。我使用了你的代码,但添加了一个select,以选择列表中的第一项。我已用解决方案更新了我的OP。@弗雷德里克特很高兴听到这个消息!剑道的开发都是关于一些小事情和技巧的,哈哈耶告诉我。这确实是一个让人头疼的问题。尽管他们做得很好,但他们有相同数量的意大利面代码缺乏文件。