【问题标题】:In between the calendar div and the external events fullcalendar在日历 div 和外部事件 fullcalendar 之间
【发布时间】:2019-06-26 12:11:26
【问题描述】:

谁能告诉我应该使用哪个全日历事件回调 处理以下情况:当前外部事件停止拖动 并且它不是通过外部事件框本地化的,也不是通过日历本地化的

知道我有这两种方法 isEventOverDiv //如果我们(不)在外部事件上返回真/假,isEventOverDivCal //如果我们(不)在日历上返回真/假

我在eventDragStop中试过:函数(事件、jsEvent、ui、视图)

  eventDragStop: function (event, jsEvent, ui, view){

    // if the event is not over the external events box and neither over the calendar
    if(!isEventOverDiv(jsEvent.clientX, jsEvent.clientY) && !isEventOverDivCal(jsEvent.clientX, jsEvent.clientY) ) {
        // reset 
         var reccupuredIndexForTitle=$(this).attr('id');
         $scope.ctrlendDragging(reccupuredIndexForTitle);
    }

    }



    //return true if we are over the external events
    var isEventOverDiv = function (x, y) {

        var external_events = $('#external-events');
        var offset = external_events.offset();
        offset.right = external_events.width() + offset.left;
        offset.bottom = external_events.height() + offset.top;

        // Compare
        if (x >= offset.left &&
        y >= offset.top &&
        x <= offset.right &&
        y <= offset.bottom) {return true;}
        return false;

    };

    //return true if we are over the calendar
    var isEventOverDivCal = function(x, y) {
                var external_events = $( '#calendar' );
                var offset = external_events.offset();
                offset.right = external_events.width() + offset.left;
                offset.bottom = external_events.height() + offset.top;

                // Compare
                if (x >= offset.left
                    && y >= offset.top
                    && x <= offset.right
                    && y <= offset .bottom) { return true;}
                return false;
    }

但它不起作用。

更新 2

为了克服在日历行程中将事件置于虚拟滚动条上方的障碍

1- 我从 mycontroller $scope.ctrlstartDragging 申请 (从 HTML 视图中触发 ondragstart="angular.element(this).scope().ctrlstartDragging(id)" 回调)。

$scope.ctrlstartDragging = function(id) {

        var book = document.getElementById(id);
        var domRect = absolutePosition(book);
            book.style.position = 'fixed';
            book.style.top = domRect.top + 'px';
            book.style.left = domRect.left + 'px';
            book.style.width=(domRect.width) + 'px';

    };

并且能够取消设置css样式(位置左上角宽度)

(注意:ondragend="angular.element(this).scope().ctrlendDragging(id)" 回调)

没有被解雇,我不知道为什么,但在我的情况下这不是问题)

所以目的是我应该手动调用

$scope.ctrlendDragging = function(id) {

   var book = document.getElementById(id);
        book.style.position = 'relative';
        book.style.top = 'unset';
        book.style.left = 'unset';
        book.style.width='unset';
};  

按照我说的做,以防用户在拖动过程中中止将事件放在日历上,并且该事件位于外部事件框和日历之外。

但在我的情况下,请参阅MyPlunk 我需要在应用还原时,在将此事件还原到外部事件框期间需要使用以下方法对其进行调用

 // reset 
 var reccupuredIndexForTitle=$(this).attr('id');
 $scope.ctrlendDragging(reccupuredIndexForTitle);

所以我需要在应用还原时应用这两行 因为如果在用户中止拖入日历时未应用它们 事件恢复,但未将未设置的 CSS 样式应用于 .style.position 左上角宽度 我会在外部事件框顶部获得一个孤立的外部事件,如下所示:

非常感谢。

【问题讨论】:

  • 我不认为有任何特定的方法可以用来检测这样的事情。 fullcalendar.io/docs/eventReceive 将检测何时将外部事件拖到日历上。据我所知,如果用户将外部事件拖动到不是日历的区域,则不会运行 fullCalendar 回调 - 因为 fullCalendar 没有检测到自身发生的任何事情,因此不关心该事件。当然,如果用户这样做,那是没有意义的,他们只是犯了一个错误?该功能的重点是允许用户将内容拖到日历上。
  • 非常感谢 ADyson 的回答。我更新了查看更新以获取更多信息。
  • 也许我在你说的话中遗漏了一些重要的东西,但你似乎让它变得非常复杂。我找到了一个 CodePen,它似乎有一些与您的代码相似的代码,但似乎也可以完成您需要的所有事情 - 可以将事件拖到日历上,也可以再次拖回“外部事件”列表。如果事件被丢弃在这两个区域之外的任何地方,它会回到它开始的地方。在这里看到它:codepen.io/subodhghulaxe/pen/qEXLLr。该演示中是否还有其他需要您做的事情?
  • 再次感谢 ADyson 查看更新 2。清楚地看到问题到底出在哪里。

标签: fullcalendar


【解决方案1】:

将以下内容添加到我的控制器中:

    var x =-1;
    var y=-1;
    $('#external-events').on('dragstop', function(evt) 
    {

            isDragging = false;
            x = evt.originalEvent.pageX;
            y = evt.originalEvent.pageY;
            if(!isDragging && x !=-1 && y!=-1 && !isEventOverDiv(x, y) && !isEventOverDivCal(x, y) )               
            {
                     // reset 
                     var reccupuredIndexForTitle=$('.fc-event').attr('id');
                     $scope.ctrlendDragging(reccupuredIndexForTitle);
            }

    }); 

从代码中可以看出,我使用了 jquery on('dragstop') 因为我不知道为什么 ondragend 事件未触发

所以我从我的视图 HTML ondragend="angular.element(this).scope().ctrlendDragging(id)"

中删除了它

并在通过 $('#external-events').on('dragstop', function(事件) 并处理了当前外部事件停止拖动并且本地化不在外部事件框也不在日历上的情况 通过

if(!isDragging && x !=-1 && y!=-1 && !isEventOverDiv(x, y) && !isEventOverDivCal(x, y) ) 

Working codePen

更新2:

因为第一个解决方案是基本的并且在危险条件下工作 它仅适用于第一个可拖动的 li 它既不准确也不精确。我对以下内容进行了更新:

    var domRect;
    var isDragging = false;
    var x =-1;
    var y=-1;
    $scope.positionX =-1;
    $scope.positionY=-1;    

    var myId=-1;

    $(document).ready(function() {
        $scope.ctrlstartDragging = function(id) {
               myId = id;
        };


        $scope.ctrlendDragging = function(id) {

           book.style.zIndex = "9999";

        };  




        $('#external-events').on('dragstop', function(evt)
        {  

           $scope.$watchGroup(['positionX','positionY'],function () {
                  x = $scope.positionX;
                  y = $scope.positionY;

           });

           if(!isDragging && x !=-1 && y!=-1 && !isEventOverDiv(x, y) && !isEventOverDivCal(x, y) )      {
                         // reset 
                         var reccupuredIndexForTitle=myId;
                         $scope.ctrlendDragging(reccupuredIndexForTitle);
           } 

        });

});//end of $(document).ready(function()

封装在$(document).ready(function(){中 应在文档就绪中应用的所有功能:

1- $scope.ctrlstartDragging 我们从中获得 myId 等于(当前 li)id 传递 通过 html 视图 ondragstart="angular.element(this).scope().ctrlstartDragging(id)"

2- $scope.ctrlendDragging n.b:我通过设置 z-index book.style.zIndex = "9999"; 这样我们就可以在模态上下文中工作了

3- $('#external-events').on('dragstop', function(evt) 应该在 $(document).ready(function() {$window.load where 添加了一个监视组,用于对 li 的 positionX positionY 所做的更改

$scope.$watchGroup(['positionX','positionY'],function () {
                  x = $scope.positionX;
                  y = $scope.positionY;

});

还添加了

if(!isDragging && x !=-1 && y!=-1 && !isEventOverDiv(x, y) && !isEventOverDivCal(x, y) )      {
                                 // reset 
                                 var reccupuredIndexForTitle=myId;
                                 $scope.ctrlendDragging(reccupuredIndexForTitle);
               } 

这一次与 myId 一起工作的是从 $scope.ctrlstartDragging

另一方面,我在初始化外部事件时添加了

$('#external-events .fc-event').each(function() {

drag: function(){ 获取当前拖动的 li 元素的确切 positionX positionY

$(this).draggable({
              zIndex: 999,
              revert: true,      // will cause the event to go back to its
              revertDuration: 0,  //  original position after the drag
      drag: function(){
                  var offset = $(this).offset();
                  var xPos = offset.left;
                  var yPos = offset.top;

                  $scope.$apply(function() {

                    $scope.positionX =xPos;
                    $scope.positionY = yPos;

                  });

              }
});

Working codePen for li

希望它可以帮助某人;)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多