Вы должны быть очень осторожны с Moment.js. Большинство его функций изменяют исходный объект. С другой стороны, вы должны сохранить текущую неделю в переменной (я полагаю, именно это и должно делать currentWeek
в вашем коде). Ваша проблема в том, что вы каждый раз создаете новый момент (), который будет установлен на текущую неделю, и у вас есть возможность только перейти на 1 неделю вперед или назад. Вот мое решение:
Рабочая скрипка
Код Javascript:
// Global variable to track the week
var timeTracker = moment();
function getDays(e) {
var days = [];
if (e == 0) {
timeTracker = moment();
} else {
timeTracker.add(e, 'weeks');
}
// Find start and end of week
var startOfWeek= timeTracker.clone().startOf('isoWeek');
var endOfWeek = timeTracker.clone().endOf('isoWeek');
var days = [];
var day = startOfWeek;
while (day.isSameOrBefore(endOfWeek)) {
days.push(day.toDate());
day = day.add(1, 'days');
}
return days.join('<br />');
}
function displayPrevWeek() {
document.getElementById('daysOfWeek').innerHTML = getDays(-1);
}
function displayCurrentWeek() {
document.getElementById('daysOfWeek').innerHTML = getDays(0);
}
function displayNextWeek() {
document.getElementById('daysOfWeek').innerHTML = getDays(1);
}
HTML-код:
<label>Week:</label>
<div id="daysOfWeek">
</div>
<div>
<button onclick="displayPrevWeek()">Previous week</button>
<button onclick="displayCurrentWeek()">Current week</button>
<button onclick="displayNextWeek()">Next week</button>
</div>
Важное примечание: Я вижу, что вы хотите, чтобы понедельник был первым днем недели. Я не знаю, почему moment().isoWeekday(1).startOf('week')
не возвращает понедельник как первый день, но воскресенье. Вместо этого я использую moment().startOf('isoWeek')
Возможно, это текущий способ сделать это (см. Примечания к выпуску для Moment.js).
Важное примечание 2: Этот код поддерживает переход на другое количествонедели вперед или назад (не нужно быть только 1 за раз). Просто вызовите getDays
с другим параметром, отличным от 1 или -1.