【问题标题】:how to get jQuery Full Calendar events to show如何让 jQuery 完整日历事件显示
【发布时间】:2018-08-31 17:02:33
【问题描述】:

我正在使用 ASP.Net、C# 和 javascript 库“jQuery full calendar”构建一个 Intranet 站点。根据文档,我有基本要求,但我认为我的脚本可能有问题,或者在日历呈现时遗漏了某些内容,但未显示列出的事件。我正在专门寻找像我的谷歌日历上那样显示的节日活动。

link to documentation

以下是我的母版页中的一些相关代码,如有必要,我可以包含整个母版页。

<link rel='stylesheet' href='Content/fullcalendar.css' />
<link rel='stylesheet' href='Content/fullcalendar.print.css' />
<link rel="stylesheet" href="Content/jquery-ui.css"/>
<script src='Scripts/moment.min.js'></script>
<script src='Scripts/jquery.min.js'></script> 
<script src="Scripts/jquery-ui.js"></script>
<script src='Scripts/gcal.js'></script>
<script src='Scripts/fullcalendar.js'></script> 
<script src='Scripts/Site.js'></script>

<script type='text/javascript'>
      $(document).ready(function() {

        $('#calendar').fullCalendar({
            theme: true,
            editable: true,
            disableDragging: true,
            disableResizing: true,
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month,basicWeek,basicDay'
            },
            googleCalendarApiKey: 'my api key',
            events: function(start, end, callback) {
        // do some asynchronous ajax
        contentType:"application/json; charset=utf-8",
            $.getJSON("/outlookHolidayCalendar2018.JSON",
                    {
                            start: dateFormat(start.getTime()),
                            end: dateFormat(end.getTime())
                    },
                    function(result) {
                            if(result != null)
                            {
                                for (i in result) {
                                    var calEvent = result[i];
                                    //calEvent.date = new Date(parseInt(calEvent.date.replace("/Date(", "").replace(")/", ""), 10));
                                    //calEvent.start = new Date(parseInt(calEvent.start.replace("/Date(", "").replace(")/", ""), 10));
                                    //calEvent.end = new Date(parseInt(calEvent.end.replace("/Date(", "").replace(")/", ""), 10));

                                    title: result.Subject;
                                    start: result.StartDate.format();
                                    end: result.EndDate.format()

                                }
                            }
                            else {
                                alert('there was an error while fetching JSON events!');
                            }
                            var calevents = result;
                            // then, pass the CalEvent array to the callback
                            callback(calevents);

                    });

            },
            eventClick : function(event) {
                editEventShow(event);
            },
            dayClick : function(dayDate){
                addEventShow(dayDate, this);
            }
        });

      });
    </script>

我的“日历”页面如下所示。

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%-- using fullcalendar from  https://fullcalendar.io/docs/intro --%>
<div id='calendar'></div>

以下是我的 JSON 文件中的示例

{
"Subject": "Easter Day",
"StartDate": "4/1/2018",
"StartTime": "12:00:00 AM",
"EndDate": "4/2/2018",
"EndTime": "12:00:00 AM",
"All_day_event": "TRUE",
"Reminder_on_off": "FALSE",
"ReminderDate": "3/31/2018",
"ReminderTime": "11:45:00 PM",
"MeetingOrganizer": "",
"RequiredAttendees": "",
"OptionalAttendees": "",
"MeetingResources": "",
"BillingInformation": "",
"Categories": "",
"Description": "",
"Location": "United States",
"Mileage": "",
"Priority": "Normal",
"Private": "FALSE",
"Sensitivity": "Normal",
"Show_time_as": 3

},

这是它如何呈现的屏幕截图:

谁能帮帮我?

【问题讨论】:

  • 旁注:&lt;link rel='stylesheet' href='Content/fullcalendar.print.css' /&gt; 必须是 &lt;link rel='stylesheet' href='Content/fullcalendar.print.css' media='print'/&gt; 否则您将始终在网页中而不是网络版本中获得 fullCalendar 的“打印”布局。如果您不明白原因,请使用 Google“CSS 媒体查询”。

标签: javascript jquery json fullcalendar momentjs


【解决方案1】:

如果您查看浏览器的控制台,我预计您会遇到一两个错误。

title: result.Subject;
start: result.StartDate.format();
end: result.EndDate.format()

是错误的 - 它没有做任何有用的事情。我知道您要做什么(即设置与 fullCalendar 的预期事件结构匹配的字段名称),但要使其正常工作,您需要实际创建一个对象。

不幸的是,完成此操作后,您通过编写 var calevents = result; 来复杂化问题 - 所以您只需将原始的整个结果数组放入 calEvents 中,而忽略处理它以匹配 fullCalendar 的期望的所有尝试。

然后是StartDate.format()...

为什么会出现这个问题?因为您的数据是从您的 JSON 中解析出来的。在您的 JSON 中,StartDateEndDate 是字符串(代表日期,但仍然是字符串)。因此,在您的 result 数组中,它们仍然是字符串。字符串没有 format() 方法。您的代码将因此而崩溃(除了所有其他问题!)。

FullCalendar(使用 momentJS 处理日期)可以通过多种方式接受日期(有关详细信息,请参阅 https://fullcalendar.io/docs/momenthttps://momentjs.com/docs/#/parsing/string/)。

它可以接受日期作为字符串,但不能接受您提供的格式 - 它是模棱两可的。 “2018 年 4 月 1 日”可能是 4 月 1 日或 1 月 4 日,具体取决于您的阅读方式 - 通常您阅读的方式取决于您所在国家/地区的惯例。但是,除非您告诉计算机,否则计算机无法确定您想要的是哪一个。

所以,你有两个选择:


选项 1)

如果您因任何原因不能/不会更改 JSON 源数据,那么您必须创建一个事件对象(或修改现有对象),该对象的字段名称和格式与 fullCalendar 匹配。您需要设置正确的属性,并使用 momentJS 来解析日期,如果您告诉它日期的格式:

events: function(start, end, callback) {
  // do some asynchronous ajax
  $.getJSON("/outlookHolidayCalendar2018.JSON", function(result) {
   for (i = 0; i < result.length; i++) {
      result[i].title = result[i].Subject;
      result[i].start = moment(result[i].StartDate, "MM/DD/YYYY");
      result[i].end = moment(result[i].EndDate, "MM/DD/YYYY")
    }
    callback(result);
  });
},

注意事项:

一个。 fullCalendar 可以接受 momentJS 对象作为输入,因此无需使用.format() 再次将其更改回字符串。

b.您的 for 语法完全错误 - 这是迭代对象属性的语法,而不是数组索引。而result 是整个数组,而不是单个项。

c。 if 语句有点多余。不返回结果并不表示错误,它只是表示没有结果。如果没有结果,则日历上不会显示任何事件,仅此而已。这不是错误或错误。

d。在 $.getJSON 请求中发送“start”和“end”参数是没有用的,因为您正在访问静态 JSON 文件。仅当您将请求发送到服务器端脚本时,发送这些参数才有用,该脚本可以处理它们并使用它们来限制返回到 fullCalendar 的数据范围。因此我将它们从我的示例中删除。


选项2)

一个更简洁的选择是更改您的 JSON,以便它以明确的格式输出日期字符串。 fullCalendar 和 momentJS 接受国际标准 IS0-8601 格式的日期字符串,其中日期部分为 YYYY-MM-DD 格式,例如2018-04-01。此时,将日期和时间字段合并为一个也是明智之举,因为 fullCalendar 将为开始和结束读取单个日期/时间字符串。然后,您以后不必将它们组合起来。您提供的示例被标记为全天活动,因此这不适用,但这将是其他活动遵循的模式。

事实上,如果您对 JSON 进行小规模改造,您可以将其置于完全不需要使用 JavaScript 处理它的状态,并且可以直接将其按原样传递给 fullCalendar。

像这样在 JSON 中编写一个事件:

{
  "title": "Easter Day",
  "start": "2018-04-01",
  "end": "2018-04-02",
  "allDay": true,
  "Reminder_on_off": false,
  "ReminderDate": "2018-03-31 23:45:00",
  "MeetingOrganizer": "",
  "RequiredAttendees": "",
  "OptionalAttendees": "",
  "MeetingResources": "",
  "BillingInformation": "",
  "Categories": "",
  "Description": "",
  "Location": "United States",
  "Mileage": "",
  "Priority": "Normal",
  "Private": false,
  "Sensitivity": "Normal",
  "Show_time_as": 3
},

然后在您的 JavaScript 中您可以简单地编写:

events: "/outlookHolidayCalendar2018.JSON"

并摆脱整个函数,因为 title、start、end 和 allDay 字段的字段名称和格式符合 fullCalendar 的预期(请参阅https://fullcalendar.io/docs/event-object)。


附:您的“googleCalendarAPIKey”选项和“contentType”行也似乎都是多余的。第一个是无用的,因为您没有在代码中访问谷歌日历,而第二个只是没有去任何地方,它只是被声明(无论如何都错误地好像它是一个对象属性)然后被丢弃。您还可以删除 gcal.js 脚本,因为它也仅用于从 Google 日历下载。

基于这一切,我认为您现在需要做的最重要的事情是更详细地研究 JavaScript 语法,并学习如何使用浏览器的开发工具(包含控制台和其他工具)来调试您的程序并查看错误。

【讨论】:

  • 非常感谢您的帮助。看来我在那里有很多错误。我实际上尝试了您的解决方案 1 和 2,但这会导致其他错误。我觉得我快到了,然后我的副总裁把整个项目搞砸了。所以我无法报告这个解决方案是否真的有效,但无论如何还是非常感谢。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多