【问题标题】:FullCalendar only appears on reloadFullCalendar 仅在重新加载时出现
【发布时间】:2013-08-15 20:58:21
【问题描述】:

所以我一直在这里发疯。我对编码很陌生,不知道如何解决这个问题。

我正在使用 ruby​​ 2 和 arshaw 的 FullCalendar 制作一个 rails 4 应用程序。

正确的脚本出现在头部。调用日历的 JQuery 脚本在头部。日历正在工作。问题是日历处于用户从标题中的链接导航到的不同视图中。日历不会出现,但会在刷新页面时出现。

我不知道为什么会发生这种情况,但我认为这与头部中的初始化脚本需要存在 div id='calendar' 有关。在调用后面的视图之前它没有这个,因此我记得头上的脚本并且一切正常。

我将在这里尽可能多地修补代码,完整代码可在以下位置获得:

https://github.com/joesus/MtgCal

到目前为止,我已经尝试使用控制器来刷新页面,但是如果它不让我进入无限循环,我无法弄清楚如何做到这一点,而且它只会刷新视图的那一部分,所以它不会无论如何帮助。

我尝试过使用 js 超时,但它似乎只刷新了部分视图而不是整个页面,所以它不起作用。

这是我的布局:application.html.erb

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= content_for?(:title) ? yield(:title) : "1311 York St" %></title>
<%= csrf_meta_tags %>
<%= render 'layouts/shim' %>   
<%= stylesheet_link_tag "application", :media => "all" %>
<%= render 'layouts/device_specific' %>
<%= javascript_include_tag "application" %>
<!-- Tried calling the script from partial _cal.html.erb instead of a .js file with the same info,
 didn't fix anything, not sure why I thought it might. -->
</head>

<body>

  <!-- <div id='calendar' style='display: none'></div> 
  Thought I could initialize it in the layout
  then call it again in the schedule view. Didn't work. -->

<%= render 'layouts/header' %>
<p id="bodytop"></p>
      <%= bootstrap_flash %>
      <%= yield %>


<%= render 'layouts/footer' %>

</div>

</body>
</html>

这是我初始化日历的脚本: /assets/javascripts/initialize.js

$(document).ready(function() {

// page is now ready, initialize the calendar...
// 

$('#calendar').fullCalendar({
   events: 'http://www.google.com/calendar/feeds/.../public/basic', 

      weekMode: 'liquid',

      height: 600,

      defaultView: 'agendaWeek',

      allDaySlot: false,

        header: {
                  left: 'title',
                  center: 'agendaDay,agendaWeek,month',
                  right: 'today prev,next'
        }


    });
});

这在头部的本地主机中显示为:

<script src="/assets/jquery-ui-1.10.3.custom.min.js?body=1"></script>

这就是我调用日历存在的地方:/views/layouts/static_pages/schedule.html.erb

<h1>Meetings</h1>
<div id='calendar'></div>

基本上,当我导航到在主布局中呈现的视图时,我需要想办法刷新头部的信息。

任何建议将不胜感激。同样,整个事情都在 github 上,所以也许我在其他地方打破了一些东西来解释这一点。

谢谢, 乔

更新:

我实现了 Erowlin 的解决方案,现在我的 initalize.js 看起来像这样:

$(document).on('ready page:load', function(){

$('#calendar').fullCalendar({

   events: 'http://www.google.com/calendar/feeds/..../public/basic', 

      weekMode: 'liquid',

      height: 600,

      defaultView: 'agendaWeek',

      allDaySlot: false,

        header: {
                  left: 'title',
                  center: 'agendaDay,agendaWeek,month',
                  right: 'today prev,next'
        },

    windowResize: function(view) {
      if ($(window).width() < 514){
        $('#calendar').fullCalendar( 'changeView', 'agendaDay' );
      } else {
        $('#calendar').fullCalendar( 'changeView', 'agendaWeek' );
      }
    }
  });
});

它运行良好,让我的 schedule.html.erb 视图看起来干净漂亮。

<h1>Meetings</h1>
<div id='calendar'></div>

windowResize 回调用于解决不同的问题。更多信息在这里: How Can I get Adam Shaw's fullCalendar to display responsively in a rails 4 app

再次感谢您的帮助。

【问题讨论】:

  • 简短更新:我将 initialize.js 中的脚本添加到 schedule.html.erb。现在它可以正常工作,但是当我在 chrome 开发人员工具中检查它时,它会暂停并给我一个包含三个断点的列表。我可以恢复脚本执行,一切似乎都正常运行,这从表面上看是好的。老实说互联网,我打破这个有多严重?

标签: jquery ruby-on-rails initialization fullcalendar partial-views


【解决方案1】:

简短回答: TurboLink 会预加载每个页面,因此不会触发 ready 事件。相反,您甚至必须将“page:load”添加到您的 javascript 中,如下所示:

咖啡脚本解决方案:

$(document).on 'ready page:load', ->
     // Your coffee script stuff

jQuery 解决方案:

$(document).on('ready page:load', function(){
     // Your stuff
}

长答案: Turbolink 不关心 JQuery 就绪事件并添加新事件。 Here 是 turbolink 的事件列表。 Turbolink 会预加载每个页面,并且不会触发 ready 事件。如果你有很多 javascript,你可以使用 this library 在你所有的 JQuery 东西上添加“page:load”。

【讨论】:

  • 非常感谢,在我实施这个之前,我想检查一下。如果当我从正文调用脚本时一切正常,是否有充分的理由重新配置所有内容以将其放入头部,还是我应该很高兴它正在工作而不管它?对不起,如果这是一个愚蠢的问题。
  • 如果它是“苏格兰式解决方案”,永远不要高兴,这是你的选择,但如果你想在未来拥有可维护和可扩展的东西,请考虑正确重写。即使对于您的个人进步,拥有一些您将来不必担心的东西总是令人愉快的“这个新功能会对我以前的代码产生副作用吗?”。如果我的回答对你有用,请标记为“Asnwered”;)
  • 说实话,我仍然无法让它工作。我有 它根本不加载页面。我添加了 gem 'jquery-turbolinks' 但是当我尝试将 //= require jquery.turbolinks 添加到 application.js 清单文件时它崩溃了。我在这里错过了一些简单的东西吗?再次感谢。
  • 是的,我打错了,我编辑了我的答案!正确的语法是 $(document).on('ready page:load', function(){ AND NOT $(document).on('ready', 'page:load', function(){
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多