Обновите Kendo NumericTextBox с помощью MVVM при вращении

Взгляните на пример MVVM здесь:

Как я могу получить значение MVVM для обновления на событии вращения (нажав стрелки вверх или вниз)

Вот что я попробовал:

В спине, я пытался сделать

$("#ntb").getKendoNumericTextBox().trigger("change");

Это сработало, но имело странные побочные эффекты.

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

Другой способ воспроизвести это - взять код отсюда (jsbin).

Вставьте его в файл HTML, загрузите его в Chrome или FF, а затем вставьте точку останова в эту строку:

$("#ntb").getKendoNumericTextBox().trigger("change");

Продолжайте нажимать, продолжайте, и вы увидите, что точка останова получает удар раз за разом.

В Firefox, если мой DOM достаточно большой, я получаю репродукцию без точки останова.

3 ответа

Решение

Я проверил ваш jsbin и я видел некоторые ошибки в HTML и JavaScript. Я думаю, что пока вы тестировали разные коды, вы забыли исправить это. В любом случае я вычищаю и исправляю ваши коды и помещаю их в это jsfiddle,

После установки точки останова (debugger;) Я видел, что ты прав onSpin событие срабатывает бесконечно, но это странное действие происходит, если вы ставите точку останова в событии. Если вы удалите точку останова и поставить console.log(" onSpin event triggered."); Вы видите, что все в порядке, и событие только что вызвало только один раз.

Я сталкивался с такими проблемами в разных сценариях, например, с использованием alert() вместо console.log() для целей отладки.


коды:

var viewModel = kendo.observable({
    selectedNumber: 0,
    isEnabled: true,
    isVisible: true,
    onSpin: function () {
        //debugger;
        console.log("`onSpin` event triggered.");
        $("#ntb").getKendoNumericTextBox().trigger("change");
    },
    onChange: function () {}
});
kendo.bind($("#example"), viewModel);

Служба поддержки Kendo говорит, что нужно выполнить это в событии вращения:

this.set('selectedNumber', e.sender.element.val());

И это заставляет проблему уйти.

Вы можете попробовать приведенный ниже код. Меня устраивает.

ViewModel

viewModel.bind("change", function (e) {
        console.log("property Changed on spin ");
    });

Код бритвы

<input id="tbSlideDuration" data-role="numerictextbox"
                             data-format="#"
                             data-min="1"
                             data-max="100"
                             data-bind="value:slideDuration, events: {spin:change}" />

это вызовет событие изменения под капотом:)

Другие вопросы по тегам