Как я могу загрузить неограниченное количество предыдущей недели с moment.js в мой календарь? - PullRequest
1 голос
/ 07 октября 2019

Я хочу загрузить предыдущую неделю, когда я нажимаю бесконечную кнопку предыдущего месяца. Я использую этот код, но он дает предыдущий месяц только один раз. После одного клика не работает. Я использую этот код

function myFunction(e) {
    if(e == 1) {
        currentWeek = currentWeek + 1;
    }else if (e == -1){
        currentWeek = currentWeek - 1;
    }else {
        currentWeek = 0
    }

    var startOfWeek, endOfWeek;
    if(currentWeek == 0){
     startOfWeek= moment().isoWeekday(1).startOf('week');
     endOfWeek = moment().isoWeekday(1).endOf('week');
    //  console.log(startOfWeek);
    }else if(currentWeek > 0) {

        startOfWeek = moment().add(currentWeek, 'weeks').startOf('week')
        endOfWeek = moment().add(currentWeek, 'weeks').endOf('week')
    }else{
        startOfWeek = moment().subtract(1, 'weeks').startOf('week')
        endOfWeek = moment().subtract(1, 'weeks').endOf('week')
    }
    var days = [];
    var day = startOfWeek;

    while (day <= endOfWeek) {
        days.push(day.toDate());
        day = day.clone().add(1, 'd');
    }
}

1 Ответ

1 голос
/ 07 октября 2019

Вы должны быть очень осторожны с 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.

...