Knockout JS: изменение события не запускается для даты HTML5 на iPad - PullRequest
6 голосов
/ 28 декабря 2011

Я использую библиотеку Knockout JS для привязки элементов управления вводом HTML5 в моем веб-приложении, которое предназначено для работы на iPad (iOS5, Safari 5.1). Привязка отлично работает для типов ввода, таких как текст и выберите, но не для даты. После выбора значения даты с помощью средства выбора даты оно не привязывается к свойству viewModel (фактически не сохраняется).

Вот так выглядит мой HTML.

<input id="dob" name="dob" type="date" data-bind="value: dob" />

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

ko.bindingHandlers.datePicker = {
    init: function (element, valueAccessor) {
        ko.utils.registerEventHandler(element, "change", function () {
            var observable = valueAccessor();
            observable($(element).val());
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);
    }
};

Изменение HTML-кода на -

<input id="dob" name="dob" type="date" data-bind="datePicker: dob" />

Странно, даже это событие не стреляет. Обратите внимание, что в обоих сценариях привязка происходит идеально в Windows XP в браузерах Opera и Safari.

В конце концов, я получил решение своей проблемы, используя событие «blur» вместо «change» в пользовательской привязке. Теперь вызывается обработчик событий, и я вручную устанавливаю значение из элемента управления датой.

Теперь мой вопрос: это то, что я делаю неправильно, и если нет, то почему не срабатывает событие изменения элемента управления датой HTML5, по умолчанию или через пользовательское связывание? Я хочу, чтобы контроль даты работал так, как он должен.

Ответы [ 2 ]

13 голосов
/ 28 декабря 2011

Вы не делаете ничего плохого с точки зрения нокаута.Эти события на самом деле просто не запускаются (без Knockout даже на картинке) из того, что я могу сказать, протестировав и немного исследовав его.

Вы можете избежать пользовательского связывания, выполнив:

<input type="date" data-bind="value: myDate, valueUpdate: 'blur'" />

4 голосов
/ 13 декабря 2012

У меня была похожая проблема, но в моем случае даже событие размытия фактически не срабатывает. Поэтому я использовал событие ввода со свойством valueUpdate и решил проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...