简体   繁体   English

Dragula拖放与复制ng2的一种方式

[英]Dragula drag and drop one way with copy ng2

I am trying to drag and drop one way with copy with ng2 dragula This is my template. 我正在尝试使用ng2 dragula拖放复制的一种方法,这是我的模板。

`<div>
   <div class='wrapper'>
     <div class='container' id='no-drop' [dragula]='"first-bag"'>
       <div>Drag/drop item 1</div>
     </div>
     <div class='container' [dragula]='"first-bag"'>
       <div>Drag/drop item 2</div>
     </div>
   </div>
 </div>` 

I have set the option to copy in my component. 我已设置要复制到组件中的选项。

constructor(private dragulaService: DragulaService) {
dragulaService.setOptions('first-bag', {
  copy: true
});

But if i set moves to false, i am not able to drag at all. 但是,如果我将移动设置为false,则根本无法拖动。 How can i move from left to right and not the other way. 我如何才能从左向右移动,而不是相反。

I found the answer soon after posting!! 发布后不久我找到了答案!!

   constructor(private dragulaService: DragulaService) {
    dragulaService.setOptions('first-bag', {
      copy: true,
      moves: function (el, container, handle) {
        return container.id !== 'no-drop';
      }
    });

By default, dragula will allow the user to drag an element in any of the containers and drop it in any other container in the list. 默认情况下,dragula将允许用户将元素拖动到任何容器中,并将其拖放到列表中的任何其他容器中。 If the element is dropped anywhere that's not one of the containers, the event will be gracefully cancelled according to the revertOnSpill and removeOnSpill options. 如果将元素放置在不是容器之一的任何位置,则将根据revertOnSpill和removeOnSpill选项优雅地取消该事件。

The example below allows the user to drag elements from left into right, and from right into left. 下面的示例允许用户从左向右拖动元素,并从右向左拖动元素。 Create code in HomePage.component.html 在HomePage.component.html中创建代码

 <div class="wrapper"> <div class="container master" [dragula]="'editor-bag'" [dragulaModel]="q1">

      <div *ngFor="let item of q1" class="box">
      {{item}}
      </div>
 </div>
 <div class="container" [dragula]="'editor-bag'">
 </div> 

Next, create HomePageComponent.ts. 接下来,创建HomePageComponent.ts。 Also, there need to set accepts method with the following signature: (el, target, source, sibling) 另外,需要设置具有以下签名的accepts方法:(el,target,source,sibling)

import { DragulaService, DragulaDirective } from 'ng2-dragula/ng2-dragula';
import { Router, Route, ActivatedRoute } from '@angular/router';
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-home-page',
  templateUrl: './home-page.component.html',
  styleUrls: ['./home-page.component.css'],
})
export class HomePageComponent implements OnInit {
  q1 = [];
  q2 = [];
  static _debug: boolean = false;
  _debug: boolean = HomePageComponent._debug;
  constructor(private dragulaService: DragulaService, private router: Router, private route: ActivatedRoute) { 
    for (var i = 0; i < 10; i++) {
      this.q1.push("1. <" + i + ">");
      //this.q2.push("2. <" + i + ">");
    }

      dragulaService.setOptions('editor-bag', {      
      accepts: function (el, target, source, sibling) {
        var fn_debug = true;
        var acceptAll = false;

          if (this._debug || fn_debug) {
            console.log("accepts() start el, target, source, sibling");
            console.log({ el, target, source, sibling });
          }
          if (target.classList.contains('master')) {
            return false;
          }
          if (sibling == null) {
            return (target.children.length == 0);
          }
          var name: string = el.innerText;
          return false;
        },

      direction: 'vertical',             // Y axis is considered when determining where an element would be dropped
      copy: function (el, source) {
        if (this._debug) {
          console.log("copy() start");
          console.log(el);
          console.log(source);
          console.log("copy() stop");
        }
        return source.classList.contains('master');
      },                       // elements are moved by default, not copied
      copySortSource: false,             // elements in copy-source containers can be reordered
      revertOnSpill: false,              // spilling will put the element back where it was dragged from, if this is true
      removeOnSpill: true,              // spilling will `.remove` the element, if this is true
      mirrorContainer: document.body,    // set the element that gets mirror elements appended
      ignoreInputTextSelection: true     // allows users to select input text, see details below
    })
  }
  ngOnInit() {

      this.dragulaService.drag.subscribe((value: any) => {
        if (this._debug) {
          console.log("drag start");
          console.log(value);
          console.log("drag stop");
          console.log(`drag: ${value[0]}`);
        }
       // this.onDrag(value.slice(1));
      });

      this.dragulaService.drop.subscribe((value: any) => {
        console.log(`drop: ${value[0]}`);
        //this.onDrop(value.slice(1));
      });

      this.dragulaService.over.subscribe((value: any) => {
        if (this._debug) { console.log(`over: ${value[0]}`); }
       // this.onOver(value.slice(1));
      });

      this.dragulaService.out.subscribe((value: any) => {
        if (this._debug) { console.log(`out: ${value[0]}`); }
        //this.onOut(value.slice(1));
      });
    }

}

I'm posting my solution as it may also help someone. 我正在发布我的解决方案,因为它可能也会对某人有所帮助。

I prefer using accepts function instead using moves function. 我更喜欢使用accepts函数而不是moves函数。

because using moves function you can stop moving items from the container. 因为使用移动功能,您可以停止从容器中移动物品。 accepts function decide whether target container is valid. 接受函数决定目标容器是否有效。

accepts: function (el, target, source, sibling) {
              // your condition
            },

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM