【问题标题】:Returning to calendar in month view always goes back one month,在月视图中返回日历总是回到一个月,
【发布时间】:2021-07-21 14:49:15
【问题描述】:

我很难让我的用户在进行更改后返回到他们工作的月份。

目前,我有一个初始化日历的函数。

var iv = localStorage.getItem("fcDefaultView") || 'timeGridWeek';
var id = localStorage.getItem("fcDefaultDate") || new Date;
        initialView: iv,
        initialDate: id,
        datesSet: function (dateInfo) {
            localStorage.setItem("fcDefaultView", dateInfo.view.type);
            localStorage.setItem("fcDefaultDate", dateInfo.startStr);
        },

奇怪的是,当用户在 monthView 以外的任何视图中时,一切正常。但是在monthView中,当他们返回日历时,它会显示上个月。

【问题讨论】:

标签: javascript fullcalendar local-storage fullcalendar-5


【解决方案1】:

您在月视图中遇到的问题是 fullCalendar 中任何月视图的“开始”日期通常是在月初之前一天或两天。例如,如果您打开当月(2021 年 8 月)的 fullCalendar 月视图,您会看到日历上显示的第一个日期是 7 月 27 日。因此,如果您在将 dateInfo.startStr 添加到 localStorage 时记录它,您会看到 2021 年 8 月(再次举例)它将保存 2021 年 7 月 27 日。

但是,如果您将其设置为下次加载日历时的初始日期,则 fullCalendar 会将视图设置为该日期所在的月份。

为了解决这个问题,您可以从视图对象中获取“currentStart”值,而不是直接使用 datesSet 回调中提供的日期,它是视图试图表示的间隔的开始,而不是开始的可见时间段。这种区别只真正适用于月视图,因此它对其他视图的已经工作行为没有影响。

将 setItem 调用更改为:

localStorage.setItem("fcDefaultDate", dateInfo.view.currentStart);

由于这是一个 JS Date 对象,然后会被序列化,而不是 ISO 字符串,因此您需要在再次读取它时显式解析它,因此需要进行另一个小改动:

var id = Date.parse(localStorage.getItem("fcDefaultDate")) || new Date();

演示:https://codepen.io/ADyson82/pen/JjNrMBd

文档:https://fullcalendar.io/docs/view-object

【讨论】:

  • 非常感谢您的详细回答。我进行了更改并收到以下错误:Uncaught TypeError: Date.parse is not a function
  • 我不明白这怎么可能。它可以在 CodePen 演示中使用,并且从第一天开始,每个浏览器都支持该功能。您是否使用某种非常晦涩的浏览器进行测试??
【解决方案2】:

这是因为月份从 0 开始,而不是 1。所以一月是“0”,二月是“1”。

【讨论】:

  • 我认为它是一个从零开始的数组,但是为什么脚本会在恢复视图时将保存为从零开始的数组的值公开,然后将该值用作从 1 开始的数组?我在哪里可以补偿和增加值以便正确恢复? ``` dateInfo.startStr ```` 是什么数据类型
  • @EddieGrimaldi dateInfo.startStr 是一个字符串。该名称为您提供了线索,documentation 明确指出,您始终可以使用 typeof() 进行测试。不太清楚你为什么要问这个。
  • 无论如何,这不是问题...查看我的答案以获得真正的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多