Framework7日历事件使用AJAX onMonthAdd加载

类似的问题,但我相信仍然有着独特的不同: Framework7 datepicker在初始化后修改事件

我有一个内联日历,其中包含从AJAX脚本加载的事件,我可以使其工作,但是将来会有数百个事件需要多年。 我需要的是一种只加载月份事件并根据需要添加它们的方法。 我认为这可以通过onMonthAdd来完成,但我遇到的问题是,当我将一个新元素推送到p.events时,直到月份从元素中删除并重新读取才会加载新事件。

例如:1月份的onMonthAdd我在1月11日添加一个事件。然后当1月进入视图时,不显示该事件。 但是,当我导航回到12月然后到11月时,1月份的日历将从DOM中删除。 然后导航回到1月,在DOM中重新创建月份,然后它将显示事件。

主要问题是, 如果在将月添加到DOM后onMonthAdd似乎被触发如何在DOM中创建元素之前添加事件如何可能 。 我找不到对beforeMonthAdd函数的任何引用。

如果我能找到一种简单地将事件(没有AJAX)添加到添加的月份的方法,AJAX是非相关的,我可以使它工作。

这是我尝试过的一些代码(不包括AJAX),但它不能用于创建日历,但在重新创建DOM的月份之前不会使用新日期进行更新:

... var calendarInline = myApp.calendar({ container: '#calendar-inline-container', weekHeader: true, firstDay: 0, events: [ new Date(2017,7,1), new Date(2017,7,31), new Date(2017,8,1), new Date(2017,8,30), new Date(2017,9,1), new Date(2017,9,31), new Date(2017,10,1), new Date(2017,10,30), new Date(2017,11,1), new Date(2017,11,31) ], onMonthAdd: function(p,monthContainer){ var thisYear = $(monthContainer).find('picker-calendar-month').context.attributes['data-year'].value; var thisMonth = $(monthContainer).find('picker-calendar-month').context.attributes['data-month'].value; if(thisMonth==0){ p.params.events.push(new Date(thisYear,thisMonth,11)); } }, }); ... 

通过使用当前年份和月份执行setYearMonth来“重新加载”日历,我找到了一种迂回的方式来实现这一点,但问题是当改变年份时它实际上会创建一个无限循环,这里的代码是那:

  ... onMonthAdd: function(p,monthContainer){ var thisYear = $(monthContainer).find('picker-calendar-month').context.attributes['data-year'].value; var thisMonth = $(monthContainer).find('picker-calendar-month').context.attributes['data-month'].value; if(thisMonth==0){ p.params.events.push(new Date(thisYear,thisMonth,11)); p.setYearMonth(p.currentYear, p.currentMonth, 1); } }, ... 

关于framework7和calendar对象的一些发现:

  • 月份在开始时加载三个(前一个,当前一个和下一个)
  • 添加后事件不会被删除,并且即使在从DOM中删除该月份后仍保留在日历对象中
  • 除了减慢脚本速度之外,同一日期的多个事件也没有任何效果。
  • 之前没有回调,只有在月之后添加
  • 可以通过调用setYearMonth并将持续时间设置为1毫秒来重新加载DOM,以便不进行明显的转换

这是修复,我没有发布所有实际代码,只是过程

  1. 创建一个数组变量来存储已处理的日期和从AJAX检索的事件,以防止额外的工作和无限循环
  2. 在处理ajax调用之前,请检查month + year是否已经处理了month数组
  3. 如果不在数组中添加到数组并使用AJAX检索事件
  4. 在AJAX完成并且数据有效后添加到p.param.events并使用setYearMonth在DOM中重新加载日历

这对我的项目非常有效,用户交互流畅而快速。