javascript - drop - Cómo arrastrar/soltar a múltiples componentes Angular2 usando ng2-dragula
dragula angular 6 (2)
Tengo un componente Angular2 que usa ng2-dragula para arrastrar / soltar así:
@Component({
selector: ''my-comp'',
directives: [
Dragula
],
viewProviders: [
DragulaService
],
template: `
<div class="my-div">
<div *ngFor="#item of items" [dragula]=''"card-bag"'' [dragulaModel]=''items''>
...
</div>
</div>
`
})
Mi problema: si creo un componente múltiple "my-comp", el elemento dentro de "card-bag" no puede arrastrar / soltar a través de estos componentes aunque tengan el mismo nombre de bolsa. Estos elementos solo pueden arrastrar / soltar dentro de su propio componente.
¿Tenemos configuraciones para arrastrar / soltar entre los componentes, o esta es la limitación ng2-dragula?
Gracias.
Si no está utilizando [dragulaModel]
entonces arrastrar y colocar entre los componentes anidados funciona bien siempre y cuando solo configure viewProviders: [ DragulaService ]
una vez en el componente superior / raíz.
Recuerde no configurar viewProviders: [ DragulaService ]
en otros componentes, ya que crea nuevas instancias para cada componente.
Editar: Recientemente he implementado el escenario dado usando el ng2-dnd
npm. Es mejor que ng2-dragula y ofrece fácil acceso de objetos y otras cosas. Podría resolver su problema.
Tengo una estructura de árbol arrastrando y soltando trabajando así:
Componente de nivel superior
- CSS ViewEncapsulation.None, incluye cualquier css aquí
- Directiva Dragula
- DragulaService ViewProvider
Registrar un filtro de aceptación en el servicio de dragula que impide que los elementos caigan dentro de sí mismos
accepts: (el: Element, target: Element, source: Element, sibling: Element): boolean => { return !el.contains(target); // elements can not be dropped within themselves },
Registrar un filtro de
moves
en el servicio de dragula para que un elemento completo se mueva juntomoves: (el: Element, container: Element, handle: Element): boolean => { // only move favorite items, not the icon element return el.tagName.toLowerCase() === ''mvp-navigation-item''; },
La plantilla Html se ve así
<div class="nav--favorites__root" [class.is-dragging]="isDragging" [dragula]="''favorites''" [dragulaModel]="favoriteLinks"> <navigation-item *ngFor="let link of links" [link]="link"> </navigation-item> </div>
Componente del elemento de navegación
- Directiva Dragula
- No DragulaService ViewProvider
La plantilla Html se ve así
<a href class="list-group-item" linkActive="active" [linkTo]="link?.url" (click)="followLink($event, link)"> <span class="glyphicon glyphicon-{{link?.icon ? link?.icon : ''unchecked''}}"></span> <span class="nav__label">{{link?.label}}</span> </a> <div *ngIf="link?.children" class="list-group list-group-inverse nav--favorites__submenu" [class.is-expanded]="link?.isExpanded" [class.is-empty]="link?.children?.length === 0" [dragula]="''favorites''" [dragulaModel]="link?.children"> <navigation-item *ngFor="let childLink of link?.children" [link]="childLink"> </navigation-item> <!-- the nav favorites items must be the first elements in the dragula container or the model sync gets confused --> <a class="btn btn-link toggle" (click)="link.isExpanded = !link.isExpanded; $event.preventDefault();"><span class="glyphicon glyphicon-triangle-{{link?.isExpanded ? ''top'' : ''bottom''}}"></span></a> </div>
Necesitará diseñar cosas para hacer que el submenú .nav - favorites sea visible como destino de colocación mientras arrastra un elemento.