了解完整日历加载事件的时间

时间:2016-12-16 20:01:16

标签: fullcalendar

我在某处创建了一个fullCalendar小部件。我无法更改初始化它的代码。所以我不能在第一次调用中添加任何回调。

像这样:

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

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

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

顺便说一句,它是fullCalendar 1.6。

3 个答案:

答案 0 :(得分: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();
});

答案 1 :(得分:0)

您可以使用版本1.6中提供的eventAfterAllRender事件:

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

最好的问候!
的Krzysztof

答案 2 :(得分: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。如果它返回一个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回调之后也显然被调用。