Angular 2 PrimeNG Scheduler onDrop 事件获取日期

Angular 2 PrimeNG Scheduler onDrop event get date

我正在尝试使用 primeNG 调度程序实现拖放支持。

这是我的模板。

<p-schedule [droppable]="true" (onDrop)="handleDropEvent($event)" pDroppable="test">

但是在处理程序中,我的事件是 DragEvent 而不是带有日期和所有其他内容的日历事件。

handleDropEvent(event: any) {
    console.log(event); //prints DragEvent
}

一个想法是 pDroppable="test" 以某种方式破坏了它,因为我最初没有它就这样做了,它对我来说看起来很自然。但总比什么事都没有发生。

还有一个想法,是因为 primeng Drag&Drop 使用本机 DragAndDrop,它不适用于 Scheduler?因为完整日历支持 Jquery-ui 的拖放。现在将检查这个。

可能是我遗漏了什么,这里有问题。

https://plnkr.co/edit/89y3KOdkU63O6vJpcJ41?p=preview

更新: 是的,看起来 pDroppable 覆盖了 onDrop 并使用自己的参数调用它。

已确认它仅适用于 jquery-UI 可拖动。

我能找到的唯一解决方案是关闭 PrimeNG 拖放并使用受支持的 JQuery-UI 一个...

在你的组件中像这样声明对 JQuery 的引用(必须使用这种语法而不是像这样 import $ from 'jquery'; 导入 jQuery,因为它创建了一个不同的上下文来阻止下班):

declare var $: any;

然后在 onInit 方法上使组件可拖动:

    ngAfterViewInit(){
        $('.draggable').draggable({
          revert: "invalid",
          revertDuration:1
        });
     }

拖动源当然可以是具有所选选择器的任何 html 元素:

<div class="draggable" style="background-color: gray;width:300px;height:30px">Drag me</div>

如果您在导入 jquery-ui 时遇到问题,我最终使用了 jquery-ui-bundle 并修改了 angular- cli.json 像这样:

"scripts": [ 
        "../node_modules/jquery/dist/jquery.min.js",
        "../node_modules/jquery-ui-bundle/jquery-ui.min.js",
        "../node_modules/moment/min/moment.min.js",
        "../node_modules/fullcalendar/dist/fullcalendar.min.js"
      ],

希望对您有所帮助...

一种在您的代码中使用 jQuery-UI 的解决方案,例如底部的 post。但我不想使用 jQuery-UI,希望 primeng 团队能解决这个问题,或者 fullcalendar 会支持原生拖放。

我的解决方案(我需要支持进入特定事件,所以将展示示例,但它也可以与 day 一起使用)

这里是 plunker - https://plnkr.co/edit/LddxzNDSyOwGlPhW1rRq?p=preview

这是解释。

所以我为事件渲染添加了处理程序

calendarOptions = {
    eventRender: this.handleEventRender()
};

并像这样用在压延机上。

<p-schedule [events]="events" [droppable]="true" [options]="calendarOptions">

eventRender 有属性,但是fullcalender 自己调用它,所以自引用被破坏了。所以通过使用选项和包装函数我可以调用我的函数

handleEventRender() {
  let that = this;

  let callback = (event: any, element: any, view: any) => {
    if (event.type == this.DROP_EVENT) {
        element.on('dragover', (jsEvent: any) => {
            jsEvent.preventDefault();
            jsEvent.originalEvent.dataTransfer.dropEffect = 'copy';
        });

        element.on('drop', (jsEvent: any) => that.handleDropEvent(event));
    }

    return element;
  };

  return callback;
}

我认为这不是最好的,我想在此函数中使用 primeng droppable 呈现事件模板。但是现在没有太多时间去深入研究它。但是因为它完全在一个地方,如果 primeng 或 fullcalender 能修复它,我希望在大多数情况下我只需要删除它。也可以用于日视图。但是因为我的日下降逻辑要复杂得多,目前还没有实现。还有 dayRender 属性,所以它应该非常相似。