wir*_*d00 8 html javascript javascript-events fullcalendar
当用户点击,日/周/月按钮时,我需要运行一些javascript代码来重新加载日历.有没有像dayButtonClicked()之类的回调?
发生BUG:
当我第一次加载日历.初始视图看起来很好,我最初加载一天.只要我加载另一个视图,如周.每个条目都是重复的,并显示两个数据源.如果我再次点击日和月之间的数据,则数据恢复正常.发生的事情是,在每天点击一次后首次加载新视图时,不会调用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>
Run Code Online (Sandbox Code Playgroud)
我甚至已经复制了你的代码,因为我认为我的代码存在问题.即使我改变了这个:
//VIEW CHANGE - ALSO ADDS INITIAL SOURCES PER DAY VIEW
viewDisplay: function(view) {
$('#calendar').fullCalendar( 'removeEventSource', fullSource );
$('#calendar').fullCalendar( 'removeEventSource', liteSource );
$('#calendar').fullCalendar( 'addEventSource', fullSource ); }
},
Run Code Online (Sandbox Code Playgroud)
当我从默认加载视图移动到另一个视图时,它仍然会加载数据.我开始认为它肯定是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;
}
},
Run Code Online (Sandbox Code Playgroud)
是的 - 不幸的是,这取决于你如何看待它 - 它可能是一个功能或一个错误!?!重要的一行是
ewDisplay: function(view) {
if (lastView == undefined) { lastView = 'firstRun'; }
if (view.name != lastView ){ ...
Run Code Online (Sandbox Code Playgroud)
来自我的另一篇文章!
为什么lastView == undefined?这是因为当日历首次加载时,甚至在屏幕上出现任何内容之前,都会触发此事件!
因此,我将var = lastview 其保留为未定义,当事件第一次触发时,它会指定firstRun它实际上可以是任何内容 - 但不是任何内容的实际名称monthView
此步骤跳过第一个事件 - 并且不会添加您的提要两次!我已将这两件事添加为开发人员的错误..但他们正在考虑它 - 因为它们是有争议的功能..
所以剩下的唯一一件事就是硬编码一个skip方法——这就是整个lastview过程的原因。我花了两三天的时间尝试调试这个问题;您需要逐行跟踪您的代码,查看何时添加提要,并尝试以某种方式避免它。
viewname不要忘记在活动结束时设置最后一个。
...
lastView = view.name;
}
Run Code Online (Sandbox Code Playgroud)