去年我一直在学习Ruby,而且我对JS很新,所以我会尽力解释这个。
我正在使用Adam Shaw's full calendar plugin。日历显示用户指定的时间段内的事件。
我想在defaultDate
设置中应用一些逻辑来规定以下内容:
如果开始月份大于或等于当前月份,则默认视图应为开始月份,而不是当前月份。 如果开始月份小于或等于当月,则同样适用。
(我意识到这一切都非常冗长和蹩脚,但我正在学习我的学习)
var defaultDateLogic = function() {
var finishDate = new Date("<%= finish.strftime("%Y-%m-%dT%H:%M:%S") %>");
var startDate = new Date("<%= start.strftime("%Y-%m-%dT%H:%M:%S") %>");
var todaysDate = new Date("<%= date_today.strftime("%Y-%m-%dT%H:%M:%S") %>");
if (startDate >= todaysDate){
startDate
// return this as default date
}
};
然后在我的日历设置中,我调用此变量
defaultDate: defaultDateLogic,
weekMode: "liquid",
events: bookingEvents, // this can be a JSON feed (extra HTTP request)
header: headerOptions,
似乎使用函数变量设置默认日期会导致fullcalendar出现此错误:
Uncaught TypeError: Cannot read property 'day' of undefinedfullcalendar.js?body=1:4614 Grid.extend.updateCellsfullcalendar.js?body=1:2869 fc.Grid.RowRenderer.extend.setRangefullcalendar.js?body=1:10018 fcViews.basic.View.extend.setRangefullcalendar.js?body=1:6644 fc.View.Class.extend.setDatefullcalendar.js?body=1:6817 fc.View.Class.extend.displayfullcalendar.js?body=1:7992 renderViewfullcalendar.js?body=1:7916 initialRenderfullcalendar.js?body=1:7880 renderfullcalendar.js?body=1:51 (anonymous function)jquery.js?body=1:385 jQuery.extend.eachjquery.js?body=1:137 jQuery.fn.jQuery.eachfullcalendar.js?body=1:30 $.fn.fullCalendarbookings:1737 setupCalendarjquery.js?body=1:3144 jQuery.Callbacks.firejquery.js?body=1:3256 jQuery.Callbacks.self.fireWithjquery.js?body=1:3468 jQuery.extend.readyjquery.js?body=1:3499 completed
为什么,以及如何解决这个问题?
答案 0 :(得分:2)
如果您查看defaultDate
的完整日历文档,则可以看到它需要moment
。片刻是一种日期对象,而不是函数。
某些 fullcalendar选项可以使用函数或对象,并且在文档中指定它们(例如selectOverlap
)。但对于defaultDate,它需要一个时刻对象。
Momentjs是运行fullcalendar所需的另一个JS脚本。它比标准的JS日期对象更好地处理日期。但是你可以保留现有代码,因为moment的构造函数可以解析JS日期。
因此,您需要做的只是传递片刻(或日期)而不是函数。
函数是JS中的对象。目前你说,“把这个功能当作一个卑鄙的”。就像你传递回调一样。
defaultDate: defaultDateLogic,
相反,您需要说“运行此函数然后传递返回的对象”。
defaultDate: defaultDateLogic(),
美好而简单。
注意:
这只会运行一次(初始化fullcalendar时)。如果你想让它在每次fullcalendar查找defaultDate
时运行......那么你就不能。 fullcalendar不支持此功能。