Как загрузить разные источники событий (json) для каждого просмотра? - PullRequest
2 голосов
/ 07 апреля 2011

Привет, у меня есть календарь, который должен загружать разные JSON-источники событий для каждого представления.т. е. краткий источник для «Месяца» (не более 3 элементов в день на ячейку), затем более подробные источники данных для «Дня» и «Недели».

Я думал, что смогу захватить, когдапредставление загружено, и в зависимости от того, какое представление, вызовите removeEventSource(), чтобы удалить предыдущий источник события, затем addEventSource(), чтобы добавить данные текущего представления и обновить их.Это единственный способ сделать что-то подобное?Если так ... как я могу определить, что представление завершило загрузку, чтобы я мог вызвать getView(), чтобы вызвать загрузку соответствующего источника события?

Я видел, что есть loading() обратный вызов, но я не думаю, что это то, что мне нужно, я хочу знать, когда завершится загрузка всего календаря, а не только текущих данных.

Спасибо за любую помощь

РЕДАКТИРОВАТЬ: Единственный другой способ, которым я могу думать, это удалить кнопки полного календаря ДЕНЬ / НЕДЕЛЯ / МЕСЯЦ и заменить их собственными, что перезагружает экран php с добавленной переменной скажем &calLoad=month or &calLoad=day Затем я могу загрузить другой канал json, но это, очевидно, менее оптимальный способ работы.

Ответы [ 3 ]

6 голосов
/ 08 июня 2012

Как ни странно, я просто опубликовал ответ на совершенно другой вопрос , который, как оказалось, является решением этого.Я использовал методы addEventSource () и removeEventSource(), как рассматривал ОП.

<script>
var fcSources = {
    courses: {
                url: base+'accessfm/calendar/courses',
                type: 'GET',
                cache: true,
                error: function() { alert('something broke with courses...'); },
                color: 'purple',
                textColor: 'white',
                className: 'course'
            },
    requests: {
                url: base+'accessfm/calendar/requests',
                type: 'GET',
                cache: true,
                error: function() { alert('something broke with requests...'); },
                textColor: 'white',
                className: 'requests'
            },
    loads:  {
                url: base+'accessfm/calendar/loads',
                type: 'GET',
                cache: true,
                error: function() { alert('something broke with loads...'); },
                color: 'blue',
                textColor: 'white',
                className: 'loads'
            }
};
$('#fullcalendar').fullCalendar({
    header: {
                left: 'title',
                center: 'agendaDay,agendaWeek,month',
                right: 'today prev,next'
            },
    defaultView: 'agendaWeek',
    firstDay: 1,
    theme: true,
    eventSources: [ fcSources.courses, fcSources.requests, fcSources.loads ],
    viewDisplay: function(view) {
        if (lastView != view.name){ // view has been changed, tweak settings
            if (view.name == 'month'){
                $('#fullcalendar').fullCalendar( 'removeEventSource', fcSources.loads )
                                  .fullCalendar( 'refetchEvents' );;
            }
            if (view.name != 'month' && lastView == 'month'){
                $('#fullcalendar').fullCalendar( 'addEventSource', fcSources.loads );
            }
        }
        lastView = view.name;
    }
});
</script>
0 голосов
/ 02 мая 2013

Спасибо за этот пример:)

Мне не удалось заставить это (в приведенном выше коде массив событий) работать на меня, но я нашел другой способ добавить источники событий, используя часть кодаВы предоставили.

Это моя логика:

Мой основной источник событий - это (это источник событий из стандартных примеров Fullcalendar):

events: function(start, end, callback) {
            $.ajax({
                type: 'POST',
                url: 'myurl',
                dataType:'xml',
                crossDomain: true,
                data: {
                    // our hypothetical feed requires UNIX timestamps
                    start: Math.round(start.getTime() / 1000),
                    end: Math.round(end.getTime() / 1000),                  
                    'acc':'2',                      
                },
                success: function(doc) {                            
                    var events = [];
                    var allday = null; //Workaround
                    var Editable = null; //Workaround  
                    $(doc).find('event').each(function() 
                    {                       
                        if($(this).attr('allDay') == "false") //Workaround 
                                allday = false; //Workaround 
                        if($(this).attr('allDay') == "true") //Workaround 
                                allday = true; //Workaround
                        if($(this).attr('editable') == "false") //Workaround 
                                Editable = false; //Workaround 
                        if($(this).attr('editable') == "true") //Workaround 
                                Editable = true; //Workaround                       

                        events.push({
                            id: $(this).attr('id'),
                            title: $(this).attr('title'),
                            start: $(this).attr('start'),
                            end: $(this).attr('end'),                       
                            allDay: allday,
                            editable: Editable
                        });                             
                    }); 


                    //calendar.fullCalendar( 'addEventSource', othersources.folgas );
                    //calendar.fullCalendar( 'addEventSource', othersources.ferias );       
                    //calendar.fullCalendar('refetchEvents');               
                    callback(events);
                }
            });     
        }

Теперь мне нужночтобы добавить больше источников и сделать это вне календаря (рядом с переменными даты из примеров fullcalendar) я создал переменную, подобную приведенному выше коду, но с вызовами ajax, аналогичными моим основным:)

var othersources = {

   anothersource: {               
            events: function(start, end, callback) {
            $.ajax({
                type: 'POST',
                url: 'myurl',               
                data: {
                    // our hypothetical feed requires UNIX timestamps
                    start: Math.round(start.getTime() / 1000),
                    end: Math.round(end.getTime() / 1000),                  
                    'acc':'7',                      
                },          
                success: function(doc) {    

                    var events = [];
                    var allday = null; //Workaround
                    var Editable = null; //Workaround  
                    $(doc).find('event').each(function() 
                    {                       
                        if($(this).attr('allDay') == "false") //Workaround 
                                allday = false; //Workaround 
                        if($(this).attr('allDay') == "true") //Workaround 
                                allday = true; //Workaround
                        if($(this).attr('editable') == "false") //Workaround 
                                Editable = false; //Workaround 
                        if($(this).attr('editable') == "true") //Workaround 
                                Editable = true; //Workaround                       

                        events.push({
                            id: $(this).attr('id'),
                            title: $(this).attr('title'),
                            start: $(this).attr('start'),
                            end: $(this).attr('end'),                       
                            allDay: allday,
                            editable: Editable
                        });                             
                    });                         

                    callback(events); //notice this
                }
            });     

        },                
            cache: true,
            //error: function() { alert('something broke with courses...'); },
            color: 'green', //events color and stuff
            textColor: 'white',
            //className: 'course'
       }     
 }

Следующий код аналогичен приведенному выше и является частью свойств календаря (внутри переменной календаря):

            eventSources: [ othersources.anothersource ],           

viewDisplay: function(view) {    
        if (view.name == 'month'){
       // alert(view.name);
            //calendar.fullCalendar( 'addEventSource', othersources.folgas );
            calendar.fullCalendar( 'addEventSource', othersources.anothersource );
            //calendar.fullCalendar('refetchEvents'); //Notice i'm not doing the refetch events. And its working for me. but i'm calling thi elsewhere, every time i make an action. So you must figure it out ;)           
        } 
0 голосов
/ 25 августа 2011

viewDisplay запускается при изменении вида http://arshaw.com/fullcalendar/docs/display/viewDisplay/

тогда вы можете проверить атрибут view.name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...