Привязка данных к предварительно отформатированному полю даты

0

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

<form id='first-dialog' data-bind='with: firstDialogModel'>
    <input data-bind='value: Name'></input>
    <input data-bind='value: SomeDate'></input>
    ...
</form>

И JS:

var vm = {
    firstDialogModel: ko.observable(),
    secondDialogModel: ko.observable(),
    thirdDialogModel: ko.observable()
};

ko.applyBindings(vm);

Как и следовало ожидать, загрузка и сохранение выполняются через вызовы AJAX, и простая привязка, кажется, в порядке. Тем не менее, я хотел бы отформатировать одно из полей как дату dd/MM/yyyy для пользователя, а затем сохранить любые изменения обратно в базу данных в качестве обычной даты в формате ISO, то есть yyyy-MM-dd

Я пробовал несколько подходов (вычисляемое поле, привязка данных и т.д.), Но в настоящее время я застрял. Может ли кто-нибудь проверить этот jsfiddle и дать мне несколько указателей, пожалуйста?

  • 1
    Всегда включайте соответствующий код и разметку в вопрос, а не только в скрипку. Скрипка является хорошим дополнением, а не заменой отдельного вопроса и минимальным тиражированием тестового примера .
  • 3
    Рассматривали ли вы возможность использовать momentJ для форматирования даты? stackoverflow.com/questions/16343747/...
Показать ещё 1 комментарий
Теги:
date
data-binding
knockout.js

1 ответ

0

Надеюсь, это поможет вам начать (см. Эту скрипку), но использует Moment.js. Первый указатель, который я бы дал, - это использовать Moment.js для любой и всей вашей обработки даты и времени на стороне клиента, потому что он превосходный.

Вот как я изменил вашу настраиваемую привязку:

ko.bindingHandlers.dateEdit = {
    init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var observable = valueAccessor();
        var initialDate = ko.unwrap(observable);

        if (moment(initialDate).isValid()) {
            $(element).val(moment(initialDate).format('YYYY-MM-DD'));
        }

    },
    update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var observable = valueAccessor();
        var initialDate = ko.unwrap(observable);

        if (moment(initialDate).isValid()) {
            $(element).val(moment(initialDate).format('YYYY-MM-DD'));
        }
    }
};

Обратите внимание, что поскольку вы используете input с type="date", формат даты должен быть 'YYYY-MM-DD' чтобы получить его значение в элементе input (см. Этот вопрос SO)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню