обратный вызов за месяц, неделю, день заголовка кнопки кликов? - PullRequest
8 голосов
/ 11 апреля 2011

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

Произошла ошибка:

при первой загрузке календаря.Первоначальный вид выглядит хорошо, мой изначально загружает день.Как только я загружаю другое представление, такое как неделя.Каждая запись дублируется и показывает оба источника данных.Если я затем нажму назад и вперед между днем ​​и месяцем снова, данные вернутся к норме.Происходит то, что 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=1&calsub=1";
        var lastView;
        var fullSource = "../fullcalendar/json-events.php?idc=<?= $sClient ?>&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;
            }
        },

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Да - к сожалению, в зависимости от того, как вы на это смотрите - это может быть функция или ошибка!?!Строка, которая важна:

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 голос
/ 21 апреля 2011

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

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

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 ) 
             { }
...