Обратный вызов для нажатия кнопки в строке заголовка месяца, недели, дня?

#javascript #html #jquery #fullcalendar #jquery-events

#javascript #HTML #jquery #полный календарь #jquery-события

Вопрос:

Мне нужно запустить некоторый код Javascript для перезагрузки календаря, когда пользователь нажимает кнопки день / неделя / месяц. Есть ли какой-нибудь обратный вызов, подобный dayButtonClicked() или что-то в этом роде?

Произошла ОШИБКА:

Когда я впервые загружаю календарь. Начальный вид выглядит нормально, мой изначально загружает day. Как только я загружаю другое представление, такое как неделя. Каждая отдельная запись дублируется и показывает оба источника данных. Если я затем снова нажму назад и вперед между днем и месяцем, данные вернутся в нормальное состояние. Что происходит, так это то, что removeEventSource не вызывается при первой загрузке нового представления после нажатия кнопки со дня на неделю. вы видели, как это происходило раньше?

 <script type='text/javascript'>

    $(document).ready(function() {
    
        var date = new Date();
        var d = date.getDate();
        var m = date.getMonth();
        var y = date.getFullYear();
        var loadUrl = "menu_booking.php?ne=1amp;calsub=1";
        var lastView;
        var fullSource = "../fullcalendar/json-events.php?idc=<?= $sClient ?>amp;v=long";
        var liteSource = "../fullcalendar/json-events.php?idc=<?= $sClient ?>";
        
        $('#calendar').fullCalendar({
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay'
            },
            columnFormat: {
                month: 'ddd',
                week: 'ddd d/M',
                day: 'dddd d/M'
            },          
            defaultView: 'agendaDay',           
            firstDay: 1,            
            //editable: true,
            selectable: true,
            allDaySlot: false,
            firstHour: 7,

                
                        

            viewDisplay: function(view) {
                if (lastView == undefined) { lastView = 'firstRun';  }
                
                if (view.name != lastView ) {
                
                if (view.name == 'agendaWeek') { 
                    $('#calendar').fullCalendar( 'removeEventSource', fullSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', liteSource ); 
                    $('#calendar').fullCalendar( 'addEventSource', fullSource ); 
                }
                if (view.name == 'agendaDay') { 
                    $('#calendar').fullCalendar( 'removeEventSource', fullSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', liteSource ); 
                    $('#calendar').fullCalendar( 'addEventSource', liteSource ); 
                }
                
                if (view.name == 'month') { 
                    $('#calendar').fullCalendar( 'removeEventSource', fullSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', liteSource ); 
                    $('#calendar').fullCalendar( 'addEventSource', fullSource ); 
                }
                lastView = view.name;
                }
            },
            
            timeFormat: { // for event elements
                agendaDay: '',
                agendaWeek: '',
                month: '',
                '': 'h(:mm)t' // default
            },          
                            
        });
        //$('#calendar').limitEvents(2);
    });

</script>
  

Я даже скопировал ваш код в точности так, как вы это делаете, потому что я думал, что была проблема с моим кодом; даже если я изменю на это:

         //VIEW CHANGE - ALSO ADDS INITIAL SOURCES PER DAY VIEW
        viewDisplay: function(view) {
                $('#calendar').fullCalendar( 'removeEventSource', fullSource ); 
                $('#calendar').fullCalendar( 'removeEventSource', liteSource ); 
                $('#calendar').fullCalendar( 'addEventSource', fullSource );                }
        },
  

Он по-прежнему дважды загружает данные, когда я перехожу из загруженного по умолчанию представления в другое. Я начинаю думать, что это, безусловно, ошибка в FullCalendar . Это сводит меня с ума

ПРАВКА 2: БОЖЕ МОЙ. Я не могу поверить, что это наконец-то сработало!

Я понятия не имею, почему, но мне нужно было поменять местами, addEventSource и removeEventSource теперь это выглядит примерно так:

         viewDisplay: function(view) {
            if (lastView == undefined) { lastView = 'firstRun';  }
            
            //alert("viewname: "  view.name   "lastView: "   lastView);
            if (view.name != lastView ) {
                if (view.name == 'agendaWeek') { 
                    $('#calendar').fullCalendar( 'addEventSource', shortSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', longSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', shortSource ); 
                }
                if (view.name == 'agendaDay') { 
                    //alert("in day: add litesource");
                    $('#calendar').fullCalendar( 'addEventSource', longSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', longSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', shortSource ); 
                }
                
                if (view.name == 'month') { 
                    //alert("in month: Delete litesource");
                    $('#calendar').fullCalendar( 'addEventSource', shortSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', longSource ); 
                    $('#calendar').fullCalendar( 'removeEventSource', shortSource ); 
                }
                lastView = view.name;
            }
        },
  

Комментарии:

1. Черт возьми, я чувствовал твою боль в течение последних нескольких месяцев. Просто наткнулся на этот вопрос после бесчисленных поисков. Будьте уверены, ваш пост помог кому-то еще! Спасибо.

Ответ №1:

Да — к сожалению, в зависимости от того, как вы на это смотрите — это может быть либо особенность, либо ошибка !?! Важная строка

 ewDisplay: function(view) {
             if (lastView == undefined) { lastView = 'firstRun';  }
             if (view.name != lastView ){ ...
  

Из моего другого поста!

Почему это происходит lastView == undefined ? Это потому, что при первой загрузке календаря еще до того, как что-либо появится на экране, это событие срабатывает!

Поэтому я делаю var = lastview и оставляю это неопределенным, когда событие запускается при первом назначении firstRun на самом деле это может быть что угодно, но не фактическое имя любого monthView Этот шаг ПРОПУСКАЕТ первое событие — и не будет добавлять вашу ленту дважды! Я добавил обе эти вещи как ошибку разработчиков.. но они думают об этом — потому что это спорные функции..

Итак, единственное, что осталось, это жестко запрограммировать метод пропуска — и именно для этого существует все это lastview . Я потратил 2 или 3 дня, пытаясь отладить эту проблему; вам нужно будет следовать вашему коду построчно и видеть, когда добавляются каналы, и пытаться как-то избежать этого.

Не забудьте установить последнее viewname значение в конце события.

     ...
       lastView = view.name;
    }
  

Комментарии:

1. Также вы можете попробовать удалить все события при смене представлений — у меня также была эта версия перед вызовом «.FullCalendar( ‘removeEvents’)» это позволит удалить все события, но не источники. Этот двойной источник — немного раздражающая проблема — надеюсь, она будет исправлена в следующем выпуске. arshaw.com/fullcalendar/docs/event_data/removeEvents

2. Приятель, ты так сильно помог, и я удивлен, что ты понял мою проблему 🙂 Что ж, я делаю все, что вы говорите, и у меня все еще возникает эта проблема. Да, я на самом деле также пробовал ‘removeEvents’, но с этим возникает более серьезная проблема, всякий раз, когда я перемещаюсь с помощью стрелок вперед / назад, добавляется все больше и больше повторяющихся строк, поэтому я вернулся к просто removeEventSource()` и у него, по крайней мере, всего 1 дубликат. Мне придется создать более урезанную версию. Со статическим исходным кодом json и базовым экраном календаря, на котором я могу опубликовать все решение и предоставить доступ к себе и разработчикам fullCalendr

3. кстати, хаха-ха, забавно, ты говоришь, что потратил 2-3 дня на работу над этим. Прошлой ночью, когда я получил ваш ответ, я вскочил на свой ноутбук и, к ужасу моей жены, просидел в постели с ~ 1 до 4 часов ночи, работая над ним! Даже если это еще не решено, я рад, что вы также видите ту же проблему, и не только я! Просто чтобы уточнить, вы хотите сказать, что действительно обошли эту повторяющуюся ошибку, возникающую в вашем lastview== undefined коде etc?

4. ppumpkin Вот демонстрация проблемы, с которой я сталкиваюсь dev2.mycmo.com.au/fullcalendar/calendar_problem_demo.php после начальной загрузки, если вы нажмете события, то есть нажмете месяц, вы увидите, что он дублирует все события. Если вы вернетесь к дню, а затем снова к месяцу, вы увидите, что дубликаты исправлены. Взгляните на этот исходный код, он кажется идентичным вашему коду, но все еще не работает

5. !!! это работает. Я переключаю addEventSource и removeEventSource по кругу. removeEventSource должно быть после addEventSource !? Пожалуйста, посмотрите мою правку выше

Ответ №2:

Обычно нажатие на кнопку просмотра запускает это событие

Будьте осторожны, потому что это событие также сработает, если вы измените дни в dayViews или месяцы в month view, но вы передаете это, сохраняя последнюю переменную

jQuery..

 .
viewDisplay: function(view) { ** }
.
  

Замените ** на любой

 .fullCalendar( 'refetchEvents' )
  

Он просто снова получит ваш канал. как обновить и обновлять любые изменения, которые могли произойти
http://arshaw.com/fullcalendar/docs/event_data/refetchEvents /

или вы могли бы переключить источники

 $('#calendar').fullCalendar( 'removeEventSource', '/diaryFeed.aspx?style=Complex' ); $('#calendar').fullCalendar( 'addEventSource', '/diaryFeed.aspx?style=Basic' );   
  

Но чтобы узнать, какие кнопки были нажаты, вам нужно будет сделать это

  eventClick: function( event, jsEvent, view ) 
             { }
  

Комментарии:

1. @pumpkin это была очень большая помощь. Я также читал другие ваши сообщения в полном календаре, и все они очень полезны, поэтому добавили в избранное. в принципе, я уверен, что я уже пробовал viewDisplay:function(view) но я был уверен, что этот обратный вызов вызывается только при начальной загрузке страницы, а не при нажатии кнопки просмотра, т. Е. недели / месяца / дня. НО … после прочтения вашего более подробного кода в другом сообщении SO я повторил viewDisplay и т.д., И это работает отлично. Теперь с помощью этого обратного вызова я просто проверю название представления. т.е. если месяц, загрузите простой источник данных, если день, затем загрузите более подробный souce. ТЫ

2. Я сталкиваюсь с реальной проблемой, когда независимо от того, что я делаю, всякий раз, когда я нажимаю в первый раз, месяц / день / неделя, данные будут отображаться дважды. по сути, это не очистка всех элементов с помощью ‘removeEventSource’, я покажу свой код в редактировании выше