【问题标题】:Update passed variables in fullcalendar events更新全日历事件中传递的变量
【发布时间】:2019-07-11 08:47:41
【问题描述】:

我有一个完整的日历,我可以在其中根据选择输入(多个)过滤事件结果:

<select id="ids" name="ids[]" class="form-control" multiple>
    <option value="1" selected> Option 1</option>
    <option value="2"> Option 2</option>
    <option value="3"> Option 3</option>
</select>

<button type="button" id="btn-filter">Apply</button>

默认视图已选择选项 1。加载页面时,fullcalendar 可以正确检索我的选择。

如果我选择其他选项(例如选项 2)并单击按钮过滤器,则全日历刷新但仍然只传递选项 1(我在调试控制台 Firefox 中看到它):

火狐控制台:

array_ids[]:    1
start:  2019-06-01T00:00:00
end:    2019-07-01T00:00:00

这是fullcalendar的一段代码

events: {
            url: './get-events.php',
            cache: false,
            type: 'POST',
            data: {
                array_ids: $("#ids").val()
            },
            error: function () {
                alert('there was an error while fetching events!');
            },
        },

这是刷新日历的按钮:

  $('#btn-filter').on('click', function(e) {

        e.preventDefault();

        $('#calendar').fullCalendar('refetchEvents');

    });

似乎 fullcalendar 在页面加载时只存储第一个值:array_ids: $("#ids").val()

编辑:好的,我已经以这种方式进行了修改:

   events: function (start, end, timezone, callback) {

           $.ajax({
             url: './get-events.php',
             data: { "array_ids": $("#ids").val(), "start": moment(start).format(), "end": moment(end).format() },
             cache: false,
             type: 'POST',
             success: function (data) {
                $('#calendar').fullCalendar('rerenderEvents');
             }
           });

        },

现在所有选择选项都已通过...但是....日历停止渲染结果...仍然为空....但是观看控制台 Firefox 我看到数据已正确收集....只是没有全日历显示!

【问题讨论】:

  • 请参阅下面的答案以修复您的原始版本。您的修改版本不起作用,因为您没有告诉 fullCalendar 新事件。想一想 - rerenderEvents 只是重新显示已经存在的内容。新的事件数据位于data...但您没有使用它。根据documentation,您必须使用提供的回调函数来告诉 fullCalendar 有关新事件的信息,这不是魔术发生的。 success: function (data) { callback(data); } 在这种情况下可以工作
  • ...或者如果 jQuery 尚未检测到 PHP 的输出是 JSON,您可能需要 success: function (data) { callback(JSON.parse(data)); }。但无论如何,您不需要这种复杂性,因为您可以使用下面的答案更简单地解决它。

标签: javascript jquery callback fullcalendar fullcalendar-3


【解决方案1】:

原因是您将静态数据传递给 fullCalendar。当你写

data: {
  array_ids: $("#ids").val()
},

您将 $("#ids").val() 的值提供给 fullCalendar 在那一刻 - 即在您创建日历的那一刻。您只需将值传递一次。 fullCalendar 接收并存储该值,并在它与您的服务器联系时重新使用它。它不知道值来自哪里,也没有办法更新它。这就是 JavaScript 的工作方式(实际上是其他大多数编程语言)——变量通常通过值传递,而不是通过引用传递(无论如何你在这里没有引用,因为你只是直接传递了函数的输出)。

根据documentation(在标题为“动态数据参数”的部分),如果您希望 fullCalendar 在每次联系服务器时检查新数据值,您需要给出这是一种方法。你这样做的方式是这样的:

不要为您的数据传递一个简单的值,而是给 fullCalendar 一个回调函数。这意味着 fullCalendar 每次都可以运行该函数,它会根据当前数据返回一个新值。

data: function() { // a function that returns an object
  return {
    array_ids: $("#ids").val()
  };
}

【讨论】:

  • 感谢@ADyson 澄清我的问题。当您回答我时,我有几秒钟的时间,使用 ajax 的部分解决方案编辑了我的帖子,该解决方案部分有效(但没有呈现...),因此您的解决方案更好并且完全有效!
  • @GiuseppeLodiRizzini 没问题!是的,这是解决它的最佳方法。请记住始终完整阅读文档 - 它通常已经包含答案,就像在这种情况下一样!但是在上面的其他 cmets 中,我还添加了一些解释,说明为什么您的第二次尝试无法正常工作,以便您也理解这一点。
  • 完美!再次感谢@ADyson
  • 抱歉另一个请求:我正在尝试迁移到 fullcalendar 4.x,因此数据被重命名为 extraParams。现在 extraParams 不将变量作为数组管理......而是作为字符串。例如,如果我选择选项 1 和 2....extraParams 将其转换为字符串:1,2 而不是 array(1,2)。有什么建议吗?
  • 你能问一个关于它的新问题吗,用一些代码和一个适当的例子,格式很好,所以我可以阅读和理解它。这是与此问题所讨论的内容不同的问题。谢谢。准备好后在此处标记我,并附上指向您的新问题的链接。
猜你喜欢
  • 2023-04-08
  • 2018-03-24
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多