[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
コールバックの後に明らかに呼び出されます。
私はfullCalendarの初期化を変更することはできません、これは新しいカレンダーを作成します。 –