2016-12-16 103 views
1

我有地方创建了一个fullCalendar部件。我无法更改初始化它的代码。所以我不能在第一次通话中添加任何回调。找出当完整的日历事件加载

这样的事:

$(elem).fullCalendar({ 
    complete: function() { 
    ... 
    } 
}) 

实际创建而不是修改实际fullCalendar更换新fullCalendar /添加完整的回调。

是否有其他方式来找出事件加载时我正在考虑轮询clientEvents,但我意识到我可以在一个月内没有事件,所以我不能指望数组总是有东西在里面。

顺便说一句,这是fullCalendar 1.6。

回答

0

您可以使用eventAfterAllRender事件,可从1.6版本:

$(elem).fullCalendar({ 
    eventAfterAllRender: function (view) { 
    ... 
    } 
}) 

最好的问候!
Krzysztof

+0

不会工作,我不能改变fullCalendar的初始化,这将创建一个新的日历。 –

1

您可以在日历对象初始化后定义回调,并确定何时呈现所有事件,请使用eventAfterAllRender事件。方法如下:

var calendar = $('#calendar').fullCalendar('getCalendar'); 
calendar.on('eventAfterAllRender', function(view) { 
    alert('all events rendered!'); 
}); 

没关系,此功能仅适用于从版本2.4开始。

相反,你可以轮询DOM的fullcalendar元素存在,就像这样:

function checkForInit() { 
    if($(".fc-view").children().length) { 
     alert("initialized!"); 
    } else { 
     setTimeout(function() { 
      checkForInit(); 
     }, 10); 
    } 
} 
$(document).ready(function() { 
    checkForInit(); 
}); 
+0

除了正如我所说的,不确定在那段时间内,一些事件将被加载。所以我不能检查正在初始化的fullCalendar。将会发生的事情是,如果没有事件发生,装载将永远轮询,这在某些方面会失败。 –

+0

上面的代码不会轮询事件元素。它轮询包装事件的表格元素,无论该视图是否有任何事件存在。 –

+0

我发现没有投票的更好方法。 –

0

好吧,我发现,似乎是工作的解决方案!

var waitPrint = true 

function autoPrint() { 
    var elem = $('.fc') 
    var calendar = elem.data('fullCalendar') 
    console.log('Searching calendar') 
    if (calendar && waitPrint) { 
     waitPrint = false 
     console.log('Bund new event') 
     var _super = calendar.options.eventAfterAllRender 
     calendar.options.eventAfterAllRender = function (event, element, view) { 
     if (_super) { 
      _super.apply(this, arguments) 
     } 

     window.print() 
     } 
    } else if (waitPrint) { 
    setTimeout(autoPrint, 100) 
    } 
} 

autoPrint() 

这里我为与fc类元素轮询。当我找到一个,我检查了“数据”命名fullCalendar的存在。如果它返回一个字典,那么就意味着fullCalendar实例被创建。这是相当多的丹麦人有什么建议2.4版本,但这个1.6没有消气。我们必须自己解决。幸运的是,它是存储在元素的data,而不是在其他一些神秘的地方。在下一步

移动,fullCalendar是不是在1.x中的eventEmitter,但我们仍然有机会获得期权,这似乎只是在第一次获得通过,该选项的参考。我覆盖了eventAfterAllRender。调用已经定义的方法(如果存在),并在完成时调用我的打印方法。

技术上从那里,我们可以从那里覆盖几乎任何定义的方法。唯一的问题是你必须比fullCalendar得到初始化更快。

我相信,如果我们深入挖掘,我们可能直接修补日历库中删除时序问题。轮询不是很好。

最好的解决方案到目前为止

var oldFullCalendar = $.fn.fullCalendar 
function newFull(options) { 
    var _super_func = null 

    if (typeof options == 'string') { 
    oldFullCalendar.apply(this, arguments) 
    } else { 
    options = options || {} 
    if (options.loading) { 
     _super_func = options.loading 
    } 
    options.loading = function (loading) { 
     console.log(loading, 'loading') 

     if (_super_func) { 
     _super_func.apply(this, arguments) 
     } 
     if (!loading) { 
     window.print() 
     } 
    } 

    oldFullCalendar.apply(this, arguments) 
    } 
} 
$.fn.fullCalendar = newFull 

第一种解决方案或许可以通过重写loading而不是得到改善。因为这是在加载已经处理时通知的方法,并且在回调之后显然也调用该方法。