【问题标题】:fullcalendar event sorting not working for me全日历事件排序对我不起作用
【发布时间】:2019-03-08 17:30:22
【问题描述】:

使用fullcalendar v3.8.2。我正在努力对我的事件进行排序。我已阅读(并重新阅读)stackoverflow 答案here。我正在使用evenOrder 并尝试了各种选项,但总是得到如下截图所示的结果。这些是“全天”事件。这是一个船发射日历,我总是想在“取出”之前显示“放入”。

显然事件不是按标题排序的,也不是按我尝试过的任何eventOrder 选项排序的。

目前我的代码如下:

  $calendar.fullCalendar({
    eventOrder: function(e) {
      return e.miscProps.sort;
    },

使用如下所示的数据:

{start: "2019-01-02", title: "30 put ins", className: "putin", sort: "0"}
{start: "2019-01-16", title: "1 take outs", className: "takeout", sort: "1"}

“putin”事件始终是 sort:0,“takout”始终是 sort:1 eventOrder: function() 被调用并正确返回 0 或 1。

谢谢。

【问题讨论】:

    标签: javascript sorting fullcalendar


    【解决方案1】:

    如果您为eventOrder 提供一个函数,那么作为您链接到状态的eventOrder docs,它接受两个 输入参数(需要比较和排序的两个事件),并且您还被告知它应该返回-101 作为比较的结果 - 作为两个输入项中的哪一个应该放在第一位的指示。

    如果第一个事件应该是列表中的第一个,则返回 -1。如果相反,则返回 1,如果相等则返回 0。其中的逻辑应该与文档中提供的原生 JS 数组排序函数的示例代码非常相似 - 请参见此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description

    您的逻辑当前只会返回未排序列表中最先出现的任何事件的“排序”值。这根本没有进行任何类型的比较,它也没有提供调用代码期望的全部可能值(即,你只返回 0 或 1,从不返回 -1 - 但即使你这样做了也不会'不一定有意义)。

    一个有效的比较函数是:

    eventOrder: function(a, b) {
      var result = 0;
      if (a.miscProps.sort < b.miscProps.sort) result = -1; //event a should be listed first
      else if (a.miscProps.sort > b.miscProps.sort) result = 1; //event b should be listed first
      return result;
    },
    

    演示:http://jsfiddle.net/c9upo8w2/1/

    但是...实际上,据我所知,您不需要为此编写自定义函数,因为您仅在“排序”字段中就非常直接地对数字的升序进行排序。无需进行复杂的计算。指定要排序的字段将完美地完成这项工作 - fullCalendar 将完成剩下的工作。您链接的文档再次声明,如果您将字段名称作为“eventOrder”选项提供,那么它将按该字段按升序对事件进行排序(否则相等)。所以:

    eventOrder: "sort"
    

    是你唯一需要写的东西。

    演示:http://jsfiddle.net/c9upo8w2/


    附:顺便说一句,您上面提供的示例数据并没有多大用处,因为它们无论如何都在不同的日期,因此自定义排序将不适用。显然,在这种情况下,我可以轻松更改它以创建演示,但提供一个实际重现问题的示例会更有意义:-)

    【讨论】:

    • 感谢您的详细解释。我应该更彻底地阅读有关使用该功能的文档。在其他尝试失败后,我开始使用该功能,特别是使用 eventOrder: 'className' 这将消除我对“排序”的需求。但是 className 是一个数组,所以我开始使用该函数,但仍然没有乐趣(因为我没有消化文档)所以我蛮力并添加了“排序”,此时我想我自己很困惑。有什么优雅的方式来使用没有函数的 className?
    • 在您的数据示例中,className 字段似乎是一个字符串而不是一个数组。所以如果你告诉它按这个字段排序,它会做一个简单的字母排序,这可能不是你想要的。如果您需要查看这些值并根据对 className 值的其他解释将它们按顺序排列,那么您将需要一个自定义函数。
    • 感谢您的帮助,不想浪费您更多的时间。简单地使用 eventOrder: 'className' 不会产生字母排序。在 eventOrder:function(a,b) 中,“className”是“a”和“b”的一个属性,它就是一个数组。再次感谢。
    • 嗯,好的。原始数据中的 className 属性将在“miscProps”中,就像“sort”一样。另一个属性可能是指分配给事件的 CSS 类,我猜(现在不是在计算机上测试它)
    • 对。 'className' 是分配给事件的 CSS 类。它在事件中显示为一个数组,而不是在“miscProps”中。并且似乎不能作为 eventOrder: value 工作,这就是我开始的地方。我试图为样式和排序重载它。但感谢您的耐心帮助,我在此过程中学到了很多东西。
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多