Arhn - архитектура программирования

Фокус ввода пользовательского интерфейса Kendo — после выбора и вызова Ajax DropdownList сохраняет фокус

У нас есть форма с раскрывающимся списком и набором элементов управления пользовательского интерфейса Telerik Kendo (а также Telerik Grid).

Когда пользователь делает выбор из раскрывающегося списка, выполняется вызов ajax для действия контроллера MVC, которое отправляет обратно больше данных, которые частично заполняют форму. Одно из этих полей представлено Kendo UI NumericTextBox.

Требование состоит в том, чтобы установить фокус ввода на этом NumericTextbox, когда данные возвращаются.

Однако это не работает ни в одном сценарии, который я пытаюсь использовать.

Вот как числовое текстовое поле определяется на странице:

@Html.Kendo().NumericTextBoxFor(model => model.ApplyFromPOA).Name("ApplyFromPOA").Step(0.01m).Min(0.00m).HtmlAttributes(new { @style = "width: 100%", @id = "ApplyFromPOA", @class = "defaultfocus" })

Вот определение выпадающего списка:

@Html.Kendo().DropDownList().Name("AddPaymentCustomer").BindTo(@Model.CustomerList).DataTextField("Name").DataValueField("ID").HtmlAttributes(new { style = "width: 100%; max-width: 300px;" }).Events(e => { e.Change("changeCustomerInAddPaymentWindow"); })

Функция changeCustomerInAddPaymentWindow выглядит так:

 function changeCustomerInAddPaymentWindow (e) {

    var dataItem = getSelectedDataItemFromDropdown(e);
    var datagrid = $('#MyCustomerInvoiceResults').data('kendoGrid');
    var dataSource = datagrid.dataSource;


    if (null != dataItem) {
        if (dataItem.ID == 0) {

            // Clear out the form

            clearOutForm();
        }
        else {

            $.ajax({
                url: "/Home/GetCustomerAndInvoices",
                type: 'POST',
                data: {
                    customerId: dataItem.ID
                },
                success: function (updatedModel) {


                    $("#ApplyFromPOA").val(updatedModel.ApplyFromPOA);
                    $("#poaAvailable").val(updatedModel.POAStringNoCommas);
                    $("#POAString").html(updatedModel.POAString);
                    $("#amount-left").html(updatedModel.POAString);

                    $.each(updatedModel.Invoices, function (index, item) {
                        dataSource.add(item);
                    });

                    dataSource.sync();

                    setTimeout(function () {
                        $("#ApplyFromPOA").select();
                        $("#ApplyFromPOA").focus();
                        $("#ApplyFromPOA").find("input").focus(0, function () { });
                    }, 200);

                },
                error: function () {

                }
            });            
        }
    }
}

Соответствующая часть - это попытка установить фокус на элементе управления "ApplyFromPOA" после возврата вызова ajax. Это не работает. Выпадающий список сохраняет фокус.

Я также пытался использовать событие «синхронизация» сетки для вызова специальной функции, которая установит фокус ввода на NumericTextBox «ApplyFromPOA». Там тоже нет любви.

В любом случае DropdownList упрямо сохраняет фокус ввода.

Проблема в том, что NumericTextbox НЕ будет обновляться до значения, установленного после вызова Ajax, до тех пор, пока кто-то действительно не щелкнет в поле. Когда вызов AJAX возвращается, мы делаем это:

$("#ApplyFromPOA").val(updatedModel.ApplyFromPOA);

Это устанавливает правильное значение внутренне, но пока кто-то не установит курсор на элементе управления, он продолжает отображать предыдущее значение.

В идеале нам все равно нужно, чтобы курсор вводился в это числовое текстовое поле.

Спасибо за вашу помощь.


Чад Леман

20th Century Fox Senior Dev/Architect Enterprise IT team


Ответы:


1

Kendo NumericTextBox на самом деле делает действительно неприятную вещь: берет существующий <input> и устанавливает его в display:none;, а затем добавляет секунду <input> поверх него. За кулисами в JS он копирует значение туда и обратно между входами.

Что вы хотите сделать, так это работать с экземпляром виджета вместо элементов ввода.

Внутри вашего обратного вызова success вместо использования функций jQuery, таких как .val() и .focus(), замените его на:

success: function (updatedModel) {
    // get Kendo widget instance
    var applyFromPoaWidget = $("#ApplyFromPOA").data("kendoNumericTextBox");

    // set new value
    applyFromPoaWidget.value(updatedModel.ApplyFromPOA);

    // set focus
    applyFromPoaWidget.focus();
}
22.08.2014
  • Спасибо чувак! Я только что пришел к такому же выводу из другого сообщения S/O: stackoverflow.com/questions/14463759/ Но вы ответили кратко и дали мне гораздо более четкий ответ. Спасибо еще раз. 22.08.2014
  • Рад, что смог помочь. Бесстыдная затычка, но у меня также есть куча полезных постов о кендо в моем блоге: codingwithspike.wordpress.com 23.08.2014
  • Милая. Я проверю это. 23.08.2014
  • И да, это ОЧЕНЬ неприятно 08.08.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..