Fullcalendar |视图更改后,Jquery悬停功能不再起作用

时间:2018-06-13 08:30:56

标签: javascript jquery symfony fullcalendar

上下文

大家好,

我正在使用Fullcalendar来显示在Symfony 3下开发的CRM应用程序中的属性(房屋)的可用性和预订。

日历功能正常。我们有.fc-event-container元素来显示预订,而.fc-bgevent用于可用性,如下所示。

fullcalendar.png

我之后添加的内容是,通过悬停已设置可用性的单元格(.fc-bgevent)以及何时可以知道。这些信息从数据库中检索,在每个单元格(.fc-bgevent)的渲染过程中存储到自定义属性«data-informations»中,最后显示在日历视图容器上方,如下所示。

fullcalendar-hover.png

为了向您展示我是如何实现这一目标的,我将下面使用的文件的代码。

控制器

   //src/LD/PlatformBundle/Controller/Properties/indexController.php
  public
  function viewAction(Request $request, $id) {

      $events = $manager - > getRepository('LDPlatformBundle:Availabilities') - > findBy(array('idProperties' => $id));

      $Availa = array();

      foreach($events as $event) {
          ...
          $Ava['user'] = $event - > getIdUsers();
          $Ava['updateDate'] = $event - > getDateModifAvailabilities();

          if ($Ava['updateDate'] != null) {
              $Ava['updateDate'] = $Ava['updateDate'] - > format('D d-M-y');
          } else {
              $Ava['updateDate'] = "unknonw date";
          }
          if ($Ava['user'] == null) {
              $Ava['user'] = 'unknown user';
          }
          $Ava['informations'] = "Created by ".$Ava['user'].
          " on ".$Ava['updateDate'];
          $Availa[] = $Ava;
      }

      return $this - > render('LDPlatformBundle:Properties:view.html.twig', array(
          'Availa' => $Availa,
      ));
  }

视图

//src/LD/PlatformBundle/Resources/views/Properties/view.html.twig
<script >

    $(document).ready(function() {
        $('#calendar').fullCalendar({
            schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
            header: {
                left: 'prev,next today',
                center: 'title',
                right: 'month,agendaWeek,agendaDay,listMonth'
            },
            navLinks: true, // can click day/week names to navigate views
            businessHours: true, // display business hours
            editable: false,
            eventOverlap: false,
            events: [{ % include('FrontBootstrap/ajaxPlanning.html.twig') %
            }],
            eventRender: function(event, element) {
                $(element).attr('data-informations', event.informations);
            },
            nextDayThreshold: "01:00:00"
        });
        $('.fc-view-container').prepend('<div id="informations-date"><span></span></div>');
        $('#informations-date').css('visibility', 'hidden');
        $('.fc-bgevent').hover(function() {
            var informations = $(this).attr('data-informations');
            $('#informations-date span').text(informations);
            $('#informations-date').css('visibility', 'visible');
        }, function() {
            $('#informations-date').css('visibility', 'hidden');
        });
    }); 
</script> 
<style >

    #informations - date {
        height: 20 px;
    }

    /* Disable hover */
    .fc - content - skeleton,
    .fc - bgevent - skeleton {
        pointer - events: none
    }

    /* Enable hover on .fc-bgevent, .fc-bgevent-skeleton child and .fc-event-container */
    .fc - bgevent,
    .fc - event - container {
        pointer - events: auto;
    }
</style>   

活动

    //app/Resources/views/FrontBootstrap/ajaxPlanning.html.twig
{ %
    for ava in Availa %
} {
    start: ('{{ ava.start|date("Y") }}-{{ ava.start|date("m") }}-{{ ava.start|date("d") }}'),
    color: '{{ ava.color }}',
    rendering: 'background',
    informations: '{{ava.informations}}',
} { %
    if loop.last %
} { %
    else %
}, { % endif %
} { % endfor %
}

问题

现在,当我通过选择其他月份(6月,7月......)或其他范围(周,月......)更改视图时,该功能不再起作用。我知道问题来自Jquery,因为我仍然在其他视图的单元格上有“data-informations”属性。我首先想到悬停函数不起作用导致它在调用函数时在DOM上的目标元素。这就是为什么我也尝试声明该函数并将其调用到viewRender参数,但它没有解决问题。

  //src/LD/PlatformBundle/Resources/views/Properties/view.html.twig
 $(document).ready(function() {
     // console.log(items);
     console.log(Availa);
     $('#calendar').fullCalendar({
         schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
         header: {
             left: 'prev,next today',
             center: 'title',
             right: 'month,agendaWeek,agendaDay,listMonth'
         },
         navLinks: true, // can click day/week names to navigate views
         businessHours: true, // display business hours
         editable: false,
         eventOverlap: false,
         events: [{ % include('FrontBootstrap/ajaxPlanning.html.twig') %
         }],
         eventRender: function(event, element) {
             $(element).attr('data-informations', event.informations);
         },
         viewRender: function(view, element) {
             console.log('ok');
             $('.fc-bgevent').hover(function() {
                 console.log('ok');
             });
             getDateInformations();
         },
         nextDayThreshold: "01:00:00"
     });
     $('.fc-view-container').prepend('<div id="informations-date"><span></span></div>');
     getDateInformations();

 });

 function getDateInformations() {
     $('#informations-date').css('visibility', 'hidden');
     $('.fc-bgevent').hover(function() {
         console.log('ok');
         var informations = $(this).attr('data-informations');
         console.log(informations);
         $('#informations-date span').text(informations);
         $('#informations-date').css('visibility', 'visible');
     }, function() {
         $('#informations-date').css('visibility', 'hidden');
     });
 }

我认为悬停功能肯定有一个我不知道的特殊功能。

1 个答案:

答案 0 :(得分:0)

您必须在fullCalendar的eventAfterAllRender而非viewRender中添加事件处理程序,因为正如文档(https://fullcalendar.io/docs/viewRender)所说,{{1}在绘制普通视图之后运行,但事件不一定在那时加载到它中 - 这是异步完成的,所以那时你的事件仍然不在DOM中。

viewRender

另见https://fullcalendar.io/docs/eventAfterAllRender