#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’, я покажу свой код в редактировании выше