У меня есть одностраничное приложение с несколькими диалогами, поддерживаемое моделью представления "Нокаут" (с одним наблюдаемым за диалогом).
<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 и дать мне несколько указателей, пожалуйста?
Надеюсь, это поможет вам начать (см. Эту скрипку), но использует 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)