【问题标题】:How to get events for FullCalendar from Controller?如何从 Controller 获取 FullCalendar 的事件?
【发布时间】:2019-09-13 07:36:34
【问题描述】:

我有一个 div,我想在其中显示基于按钮单击的日历:

<label class="btn" onclick="getCalendar();"> Show Calendar </label>

<div id="calendarDiv">

</div>

getCalendar()函数实现如下:

function getCalendar() {
    var calendar = new FullCalendar.Calendar($("#calendarDiv"), {
        plugins: ['dayGrid'],
        header: {
            left: 'title',
            center: '',
            right: 'today prev,next'
        },
        buttonText: {
            today: 'Today'
        },

        defaultView: 'dayGridMonth',
        defaultDate: '2019-09-12',

        events: function(fetchInfo, successCallback, failureCallback) {
            $.post('/Customer/GetCalendarEvents',
                $.param({
                        selectedCountryIds: getSelectionsByName('cntName'),
                        fiscalYearEnd: '31/12/2018'
                    },
                    true),
                function (res) {
                    var events = [];
                    console.log(res);
                    $.each(res,
                        function (index, value) {
                            events.push({
                                title: value.title,
                                start: value.start
                            });
                        });
                    successCallback(events);
                })
                .fail(function () {
                failureCallback(alert('bla')); 
            });
        }
    });
    calendar.render();
}

其中,GetCalendarEvents(selectedCountryIds, fiscalYearEnd) 返回一个 Json 数组,其中包含如下构造的事件列表:

public JsonResult GetCalendarEvents(List<int> selectedCountryIds, string fiscalYearEnd) {
    // some initial steps to get finalList
    // creating result array
    var result = finalList.Select(r => new
    {
        title = r.Item2 + " : " + r.Item3,
        start = r.Item1
    });
    return Json(result, JsonRequestBehavior.AllowGet);
}

该函数返回正确的数组,并且正确生成了 events[],但是,当我运行它时,我什么也没有显示,并且在控制台中我看到一个错误:

main.min.js:6 Uncaught TypeError: e.addEventListener is not a function
    at O (main.min.js:6)
    at e.bindHandlers (main.min.js:6)
    at e.render (main.min.js:6)
    at getCalendar (ViewName:1118) // this is the line with calendar.render();
    at HTMLLabelElement.onclick (ViewName:1037)

任何建议可能是什么问题,我该如何解决?我正在使用最新版本的 FullCalendar。

【问题讨论】:

  • 试试 $("#calendarDiv")[0]

标签: javascript jquery asp.net-mvc fullcalendar fullcalendar-4


【解决方案1】:

看起来问题是 $("#calendarDiv") 返回一个 jQuery 对象,但 fullCalendar 构造函数需要一个原生 DOM 元素。

可以$("#calendarDiv")[0] 来从jQuery 对象中提取DOM 元素(如其中一个cmets 中所建议的那样),但是创建一个jQuery 对象只是为了抛出它立即再次消失。

而只是使用原生选择器:

var calendar = new FullCalendar.Calendar(document.querySelector("#calendarDiv"), {

附:我认为您可以大大简化您的事件代码。这段代码最初让我印象深刻:

events.push({
  title: value.title,
  start: value.start
}); 

不清楚您为什么要重新创建一个与原始结构具有相同结构的对象?您将得到与输入完全相同的输出!

如果服务器已经以正确的格式输出 JSON,那么您可以使用更简单的 events as JSON feed 模式将您的事件连接到 fullCalendar。您只需为 fullCalendar 提供 URL 和基本参数,其余的会交给它:

events: {
  url: '/Customer/GetCalendarEvents',
  method: "POST",
  extraParams: function() { // a function that returns an object
    return {
      selectedCountryIds: getSelectionsByName('cntName'),
      fiscalYearEnd: '31/12/2018'
    };
  }
}

【讨论】:

  • getElementById 比 querySelector 得到更好的支持。其他一切都是完美的答案Upvote:P
  • @angel.bonev 谢谢,但出于兴趣,您认为对 querySelector 的支持存在哪些问题? developer.mozilla.org/en-US/docs/Web/API/Document/… 表示对不同浏览器和版本的支持非常广泛。你有具体的例子吗?
  • document.querySelector supportdocument.getElementById 是 DOM 的一部分,从级别 1 开始,如果您测试它,所有浏览器都支持它,它的速度提高了 51% benchmark
  • @angel.bonev 好的,但在支持方面,没有人关心那些从一开始就支持它的古老浏览器。并且性能基准测试与对语法的支持不同。使用 getElementById 似乎可以显着提高性能。但话又说回来,在现实世界中没有人一次选择 10000 个元素。如果只选择一个,差异可以忽略不计。不过,您可能希望 querySelector 稍微慢一些,因为如果您愿意,它可以选择的不仅仅是一个 ID。我认为为此目的,这是一个有争议的问题,但谢谢。
  • @angel.bonev 通常这是一个合理的方法,但在这种情况下实际上没有值得支持的差异,除非你真的需要支持像 IE7 这样的东西,但现在这将是非常不寻常的。
【解决方案2】:

正如您在the official docs 中看到的,您需要传递Element,但在您的代码中$("#calendarDiv") jquery 将返回元素read mode here 的类似数组的对象,所以如果您需要使用jquery选择器你可以像这样 $("#calendarDiv")[0] 得到它,或者你可以像the official docs中的建议那样做

 var calendar = new FullCalendar.Calendar(document.getElementById('calendar'), { ... 

【讨论】:

  • "jquery 将返回元素数组" ...从技术上讲,它将返回一个 jQuery 对象,而不仅仅是一个数组。事实上,您提供的链接解释了这一点。但是创建一个 jQuery 对象,将 DOM 元素放入其中,然后立即再次丢弃它以获取本机 DOM 元素有什么意义呢? jQuery 构造函数是一个相对复杂和昂贵的东西。最好不要浪费浏览器的时间,而只需使用本机选择器方法,例如document.getElementById 或 document.querySelector。 jQuery在这里只是一个毫无意义的开销
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2021-06-06
相关资源
最近更新 更多