Vue JS применить фильтр на v-модели в поле ввода
надеюсь, кто-то может мне помочь! Я сделал директиву, обертывающую плагин Jasny Bootstrap более конкретно, вещь ввода-маски, и все идет хорошо!
Теперь я сделал пользовательский фильтр, поддерживаемый моментом, чтобы отформатировать поле даты!
формат даты, который я получаю от моего бэкэнд-приложения, - YYY-MM-DD, и я должен показать в представлении как DD/MM/YYYY... Я пытался v-model="date | myDate"
но это не сработало правильно!
JS
Vue.directive('input-mask', {
params: ['mask'],
bind: function() {
$(this.el).inputmask({
mask: this.params.mask
});
},
});
Vue.filter('my-date', function(value, formatString) {
if (value != undefined)
return '';
if (formatString != undefined)
return moment(value).format(formatString);
return moment(value).format('DD/MM/YYYY');
});
var vm = new Vue({
el: 'body',
data: {
date: '2015-06-26',
}
});
HTML-код
<label>Date</label>
<input type="text" class="form-control" v-input-mask mask="99/99/9999" v-model="date">
<p>{{ date | myDate 'dd/mm/yyyy' }}</p>
есть JSBin если кто-то заинтересован!
спасибо заранее!
EDIT: лучше объяснить, что я ожидаю =)
при первой загрузке страницы вход получает значение 2015-06-26, и я хотел бы показать это значение как DD/MM/YYYY так 26/06/2015! Он работает правильно только после того, как я начинаю печатать что-то!
3 ответов
Я понимаю, что вы пытаетесь сделать, однако, из-за двухсторонней привязки при использовании v-модели, может быть, лучше просто отформатировать дату, как вы ее получаете с сервера, а затем использовать ее с требуемым форматом в вашем интерфейсном приложении ('DD/MM/YYYY'
).
при отправке данных обратно на сервер, вы просто отформатировать его обратно в нужный формат сервера ('YYYY-MM-DD'
).
в вашем приложении Vue рабочий поток будет примерно таким:
new Vue({
el: 'body',
data: {
date: null,
},
methods: {
getDataFromServer: function() {
// Ajax call to get data from server
// Let's pretend the received date data was saved in a variable (serverDate)
// We will hardcode it for this ex.
var serverDate = '2015-06-26';
// Format it and save to vue data property
this.date = this.frontEndDateFormat(serverDate);
},
saveDataToServer: function() {
// Format data first before sending it back to server
var serverDate = this.backEndDateFormat(this.date);
// Ajax call sending formatted data (serverDate)
},
frontEndDateFormat: function(date) {
return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY');
},
backEndDateFormat: function(date) {
return moment(date, 'DD/MM/YYYY').format('YYYY-MM-DD');
}
}
});
этот хорошо работает для меня, надеюсь, это поможет.
вот скрипка для него:
https://jsfiddle.net/crabbly/xoLwkog9/
обновление синтаксиса:
...
methods: {
getDataFromServer() {
// Ajax call to get data from server
// Let's pretend the received date data was saved in a variable (serverDate)
// We will hardcode it for this ex.
const serverDate = '2015-06-26'
// Format it and save to vue data property
this.date = this.frontEndDateFormat(serverDate)
},
saveDataToServer() {
// Format data first before sending it back to server
const serverDate = this.backEndDateFormat(this.date)
// Ajax call sending formatted data (serverDate)
},
frontEndDateFormat(date) {
return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY')
},
backEndDateFormat(date) {
return moment(date, 'DD/MM/YYYY').format('YYYY-MM-DD')
}
}
})
у меня была аналогичная проблема, когда я хотел ввести значение в верхнем регистре.
вот что я делал:
// create a directive to transform the model value
Vue.directive('uppercase', {
twoWay: true, // this transformation applies back to the vm
bind: function () {
this.handler = function () {
this.set(this.el.value.toUpperCase());
}.bind(this);
this.el.addEventListener('input', this.handler);
},
unbind: function () {
this.el.removeEventListener('input', this.handler);
}
});
тогда я могу использовать эту директиву в поле ввода с v-model
.
<input type="text" v-model="someData" v-uppercase="someData">
теперь, когда я ввожу в это поле или изменить someData
, то значение преобразуется в верхний регистр.
это по существу сделало то же самое, что я надеялся v-model="someData | uppercase"
будет делать. Но, конечно, ты не можешь этого сделать.
подводя итог: сделать
когда вы получите значение изначально, отрегулируйте его, чтобы соответствовать входу. Я заставил его работать в ready
функция, но вы можете сделать это и после вызова DB:
ready: function(){
var year = this.date.substr(0, 4);
var monDay = this.date.substr(5,5);
var result = monDay + "-" + year;
this.date = result.replace(/-/g,"/");
}
возможно, вам придется сделать что-то подобное на обратном пути к вашей базе данных.