2016-12-16 5 views
1

どこかで作成されたfullCalendarウィジェットがあります。私はそれを初期化するコードを変更することはできません。だから私は最初の呼び出しでコールバックを追加することはできません。このようなフルカレンダーがロードされたイベントを確認する

何か:

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

はなく、実際に完全なコールバックを追加/変更するには、実際のfullCalendarを変更する新しいfullCalendarを作成します。

イベントがロードされるタイミングを調べる方法はありますかclientEventsポーリングを考えていましたが、1か月でイベントが発生しないように気付きました。

ところで、それはfullCalendar 1.6です。

答えて

0

あなたは、バージョン1.6から利用可能eventAfterAllRenderイベントを、使用することができます。

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

敬具!
Krzyszof

+0

私はfullCalendarの初期化を変更することはできません、これは新しいカレンダーを作成します。 –

1

カレンダーオブジェクトを初期化した後でコールバックを定義し、すべてのイベントがレンダリングされた時点を判断するには、eventAfterAllRenderイベントを使用します。方法は次のとおりです。

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

Nevermind、この機能はバージョン2.4以降でのみ使用できます。

代わりに、あなたはこのように、fullcalendar要素の存在のためにDOMをポーリングできます。

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

私が言ったように、その時間帯にはいくつかのイベントがロードされることは確かではありません。したがって、私はfullCalendarが初期化されているかどうかを確認できません。何が起こるのかということは、イベントがなければ、ロードは永遠に何らかの方法で失敗するだろうということです。 –

+0

上記のコードはイベント要素をポーリングしません。イベントをラップするテーブル要素をポーリングします。この要素は、そのビューのイベントがあるかどうかに関係なく存在します。 –

+0

私はポーリングなしでより良い方法を見つけました。 –

0

[OK]を、私が働いているようだ解決策を見つけました!

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という名前の "データ"の存在を確認します。 dictを返すと、fullCalendarインスタンスが作成されたことを意味します。これはDaneがバージョン2.4で提案したものですが、1.6ではゲッターがありません。私たちはそれを自分で手に入れなければなりません。幸いにも、それは要素のdataに格納されていて、他の隠された場所には格納されていません。

次のステップに進んでください。fullCalendarは1.xのeventEmitterではありませんが、最初に渡されたオプションの参照にすぎないようです。私はeventAfterAllRenderより優先されます。存在する場合はすでに定義されているメソッドを呼び出し、完了したらprintメソッドを呼び出します。

技術的には、そこからほぼすべての定義済みのメソッドをオーバーライドできます。唯一の問題は、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をオーバーライドすることで改善することができます。これは、ロードが処理されたときに通知するメソッドであるため、eventAfterAllRenderコールバックの後に明らかに呼び出されます。

関連する問題