#javascript #vue.js #datepicker #bootstrap-vue
#javascript #vue.js #datepicker #bootstrap-vue
Вопрос:
У меня есть два BootstrapVue datepickers в моей форме в Vue.js . Я хотел бы реализовать менеджер праздников, чтобы вы могли определить дату начала (ввода-3) и дату окончания (ввода-4) вашего отпуска. Конечная дата должна быть больше или равна начальной дате. Моя текущая реализация выглядит следующим образом:
<b-form-group
id="input-group-3"
label="Anfangsdatum:"
label-for="input-3"
>
<b-form-datepicker
id="input-3"
v-model="von"
placeholder="Anfangsdatum auswählen"
required
:min="minAnfang"
></b-form-datepicker>
</b-form-group>
<b-form-group id="input-group-4" label="Enddatum:" label-for="input-4">
<b-form-datepicker
id="input-4"
v-model="bis"
placeholder="Enddatum auswählen"
:min="minEnde"
required
></b-form-datepicker>
</b-form-group>
Часть данных в Vue реализована следующим образом:
data() {
const datum = new Date();
const datum_heute = new Date(datum.getFullYear(), datum.getMonth(), datum.getDate());
const minVon = new Date(datum_heute);
minVon.setDate(minVon.getDate() 1);
const minBis = new Date(datum_heute);
minBis.setDate(minVon.getDate() 1);
return {
Urlaubsart: "",
Grund: "",
von: "",
bis: "",
Status: "",
BenutzerID: 24,
minAnfang: minVon,
minEnde: minBis,
arten: [
{ value: null, text: "Wählen Sie die Urlaubsart aus" },
{ value: "Urlaub", text: "Urlaub" },
{ value: "Sonderurlaub", text: "Sonderurlaub" },
],
gruende: [
{ value: "Umzug", text: "Umzug" },
{ value: "Hochzeit", text: "Hochzeit" },
{ value: "Geburt", text: "Geburt" },
{ value: "Umzug", text: "Sonstiges" },
],
Urlaubstage: "",
};
}
Итак, как я могу гарантировать, что конечная дата равна начальной дате или больше?
Комментарии:
1. Один из вариантов — сделать конечную дату вычисляемым свойством с помощью get / set, как описано здесь: vuejs.org/v2/guide/computed.html#Computed-Setter Во время набора вы можете проверить входные данные и сравнить их с датой начала. Еще лучше: выполните проверку в get, когда изменится дата начала, дата окончания также изменится.
2. Не могли бы вы предоставить фрагмент кода? Я не совсем понимаю, что вы имеете в виду.
Ответ №1:
Я создал для вас codepen: https://codepen.io/mtveerman/pen/gOwwNoL (обратите внимание, что я использую vuetify в качестве движка верстки, но вы поймете идею)
Что я сделал:
- Определить
internalBis
свойство - Определите вычисляемое
bis
свойство сget
set
помощью функции and: - Установите
internalBis
свойство вset
функции - Сравните
von
иinternalBis
вget
функции, вернитеvon
, еслиinternalBis
меньше, чемvon
В ваших компонентах и отправлениях форм вы должны работать только с bis
, поскольку это всегда будет возвращать правильное значение. Обратите внимание, что если von
теперь изменится на дату после оригинала bis
, bis
она также автоматически изменится.
Для вас самый интересный код — это:
data: () => ({
von: new Date().toISOString().substr(0, 10),
internalBis: new Date().toISOString().substr(0, 10)
}),
computed: {
bis: {
// getter
get: function () {
if (this.internalBis < this.von) {
return this.von
}
return this.internalBis
},
// setter
set: function (newValue) {
this.internalBis = newValue
}
}
}
Комментарии:
1. Я получаю ошибку при рендеринге: «InternalError: слишком много рекурсии». Я удалил свойство bis из data и добавил его в computed . Я также удалил свойство minBis и minEnde. Код выглядит следующим образом:
computed: { bis: { get: function () { if (this.bis < this.von) { return this.von } return this.bis }, set: function(newValue) { this.bis = newValue } } }
2. Нет, посмотрите на мой код. Есть причина, по которой я использую
internalBis
. Вы не можете установитьthis.bis
в установщике, поскольку это приведет к рекурсивному вызову установщика.3. Хорошо, спасибо! Теперь это работает, поэтому, когда я выбираю дату von, чем дата bis равна дате von, но все же можно выбрать дату bis, то есть до даты von..
4. Ну, вам нужно будет поиграть со
:min
свойствами, например, установив для него значение:min="von"
, или создать другое вычисляемое свойство для этого, где вы возвращаетеvon
1 день.5. Я обновил codepen, чтобы показать вам принцип.