2016-12-16 99 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而不是得到改善。因爲這是在加載已經處理時通知的方法,並且在回調之後顯然也調用該方法。