【问题标题】:Fullcalendar 2.5 eventSource url appends start and end date incorrectly formattedFullcalendar 2.5 eventSource url 附加格式不正确的开始和结束日期
【发布时间】:2015-12-11 21:48:48
【问题描述】:

因此,我正在将 AngularJS 应用程序中的 fullcalendar 从 1x 升级到 2x,并且遇到了一些问题,其中收集日历事件所需的 eventSource url 附加了格式为 ( YYYY-MM-DD) 需要在几秒钟内完成时——我认为——至少我们在 1x 版中是这样工作的。

当我的控制器被实例化时,我要做的第一件事是建立传递给 fullcalendar 指令所需的 eventSources 变量(我正在使用角度 fullcalendar 包装器指令:http://angular-ui.github.io/ui-calendar/)。

HTML:

<div id="calendar" class="col-sm-9" ng-model="eventSources" calendar="myCalendar" config="uiConfig.calendar" ui-calendar="uiConfig.calendar"></div>

控制器:

$scope.eventSources = [];
for (var i = 0; i < calendars.length; i++) {
    $scope.eventSources[i] = getEventSource(calendars[i]);
}

var getEventSource = function(calendar) {
        return {
            cid: calendar.cal_head_id,
            url: "/api/classroom/student/calendar?ids=" + calendar.cal_head_id,
            className: 'calendar-' + calendar.sort_order,
            backgroundColor: calendar.color_code
        };
    };

但是我的字符串参数一直显示为:

ids=2525213&start=2015-11-30&end=2016-01-11&_=1449868998385

最后是我处理请求的服务器端代码:

[ActionName("calendar")]
        public JsonArray GetCalendarEvents(string ids, int start, int end)
        {
            var calendars = ids.Split(',');
            var startDate = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(start);
            var endDate = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(end);

            var data = new CalendarService().GetEvents(calendars, 0, startDate, endDate);

            var events = new JsonArray();
            var results = (JsonArray) data["results"];

            foreach (JsonObject obj in results)
            {
                var name = ((JsonString) obj["name"]).Value;
                if (name == "<b>Homework</b>")
                {
                    name = "<img src=/images/icons/house.png /> Homework";
                }

                var link = ((JsonString) obj["link"]).Value;
                if (!string.IsNullOrEmpty(link) && link.Contains("doEditEvent"))
                {
                    link = "";
                }

                var eventStart = Convert.ToDateTime(obj["start_time"].ToString());
                var eventEnd = Convert.ToDateTime(obj["end_time"].ToString());

                events.Add(new JsonObject
                {
                    {"id", obj["event_id"]},
                    {"calId", obj["calendar_id"]},
                    // Note: Firefox requires the dates are in the below format - JD 6/12/2013
                    {"start", eventStart.ToString("o")},
                    {"end", eventEnd.ToString("o")},
                    {"allDay", eventStart == eventEnd.AddMinutes(1).AddDays(-1)},
                    {"title", name},
                    {"link", link},
                    {"description", obj["description"]}
                });
            }

            return events;
        }

手动添加 start 和 end 的问题是 fullcalendar 默认会这样做,因此它会多次连接参数。根据关于从 1x 升级到 2x (http://fullcalendar.io/wiki/Upgrading-to-v2/) 的文档,该库已更新为使用 moment,这很棒,因为我认为这可以解决任何格式问题,而且我的项目中肯定包含了它。

我在这里寻找一个解决方案,希望我不会篡改完整日历源代码,否则我需要回到 1x。

【问题讨论】:

    标签: c# angularjs fullcalendar momentjs


    【解决方案1】:

    startParam 和 endParam 从 v1 更改为 v2,从 UNIX 时间戳更改为 ISO8601 样式的日期字符串。您必须添加包含时间戳的附加参数、破解 fullcalendar.js 以发送时间戳、重新编写服务器端代码或使用 v1.xx

    对于您的服务器端代码,您似乎可以将其更改为

    [ActionName("calendar")]
            public JsonArray GetCalendarEvents(string ids, string start, string end)
            {
                var calendars = ids.Split(',');
                var startDate = DateTime.parse(start);
                var endDate = DateTime.parse(end);
    

    如果您想将 'start' 和 'end' 覆盖为 UNIX 标记,这可以工作。

    See fiddle here

    $('#calendar').fullCalendar({
      /* You can rename the start and end params from 'start' and 'end' */
      /* In this code, 'start', 'end' and 'startDate' and 'endDate' will be on URL */
      startParam: 'startDate',
      endParam: 'endDate',
      eventSources: [{
        url: '/test', /* Set this to whatever is appropriate */
        data: function() {
            var view = $('#calendar').fullCalendar('getView');
          return {
            /* Then you can change 'start' and 'end' in the URL to be UNIX stamps */
            'start': view.start.unix(),
            'end': view.end.unix(),
          };
        },
        /* This is just to demo the URL being queried, not required */
        beforeSend: function () {
            alert(this.url);
        }
      }]
    });
    

    【讨论】:

    • 更改服务器端代码为我做了这件事,并且将是我采用的解决方案,尽管学习如何手动完成它可能会很好。当我尝试这种手动方法时遇到的问题是我不知道如何阻止 fullcalendar 第二次附加这些参数。
    • 我添加了一些代码,这些代码将重命名开始/结束参数并将它们覆盖为 UNIX 时间戳。
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多