Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ng2-dragula [dragula] (angular2 drag and drop) - *ngFor with [dragulaModel] attribute not working

Using ng2-dragula drag and drop wrapper library for angular 2 dragula.

https://github.com/valor-software/ng2-dragula

Seeing issues with the [dragulaModel]='myList' ... when the item gets dropped ... poof ... it disappears.

Inspecting the element, I see it remains in model, but the DOM element loses its inner html (becomes empty div) - causing the div to "appear" to be hidden.

import { Component } from '@angular/core';
import { DragulaService } from 'ng2-dragula/ng2-dragula';

@Component({

moduleId: module.id,
selector: 'my-app',
template: `
 <div>
    <div class='wrapper'>
      <div class='container' *ngFor='let fixture of fixtures' [dragula]='"first-bag"' [dragulaModel]='fixtures'>
        <div>{{fixture.name}}</div>
      </div>
    </div>
  </div>
`,
viewProviders: [DragulaService],
styles: [`
.wrapper {
  display: table;
}
.container {
  display: block;
  background-color: rgba(255, 255, 255, 0.2);
  width: 200px;
}
.container div,
.gu-mirror {
  margin: 10px;
  padding: 10px;
  background-color: rgba(0, 0, 0, 0.2);
  transition: opacity 0.4s ease-in-out;
}
.container div {
  cursor: move;
  cursor: grab;
  cursor: -moz-grab;
  cursor: -webkit-grab;
}
.gu-mirror {
  cursor: grabbing;
  cursor: -moz-grabbing;
  cursor: -webkit-grabbing;
}
`]

})
export class DragulaComponent { 
fixtures: any[];

constructor( private dragulaService: DragulaService ) { 
    dragulaService.dropModel.subscribe((value:any[]) => {
        console.log(value);
        console.log(this.fixtures[0]);
    });
}

ngOnInit(): void {
    this.fixtures = [
         { id: 11, name: 'Table 1', day: 1, duration: '4h', closetBuild: true, clearance: false, consolidateExpand: '', associateMoves: 'dan', notes:'blah blah blah.', items: [ {name: "christmas sweaters", skus: [{sku:'123', comingFrom:'test coming from', earlySet: false}] }] },
         { id: 12, name: 'Table 2', consolidateExpand:'', duration: '1.5H'},
         { id: 13, name: 'Table 3 / C5', consolidateExpand:'e', day: 99, duration: '99.99h', },
         { id: 14, name: 'Table 4', day: 1 },
         { id: 15, name: 'Closet 70-71', day: 1, duration: '19h', closetBuild: false, clearance: false, consolidateExpand:'e', items: [ {name: "christmas sweaters and other very cool stuff", skus: [{sku:'123-456-789-111', comingFrom:'blah blah blah coming from', earlySet: 'fixtures'},{sku:'123-aaaa-383838383838-1', comingFrom:'test coming from'}] }] },
         { id: 16, name: 'Closet 77-78' },
         { id: 17, name: 'Closet 80-81' },
         { id: 18, name: 'Closet 82-83' },
         { id: 19, name: 'BACKSTOCK' },
         { id: 20, name: 'TABLE C1' }
     ];
}
}
like image 234
Dan J Avatar asked Dec 08 '16 16:12

Dan J


1 Answers

Welp, figured out the issue. The inner html is blank because the actual DOM element dragula moves is the inner html (element's content), instead of moving the element marked with attribute [dragula].

This fixed it:

    <div class='wrapper' [dragula]='"first-bag"' [dragulaModel]='fixtures'>
      <div class='container' *ngFor='let fixture of fixtures'>
        <div>{{fixture.id}}</div>
      </div>
    </div>

Their own documentation is a little unclear with this, as they have:

<ul>
  <li *ngFor="let item of items" [dragula]='"bag-one"' [dragulaModel]='items'></li>
</ul>

Moral of story: move your [dragula] and [dragulaModel] UP one element from where you put your *ngFor.

like image 188
Dan J Avatar answered Nov 15 '22 03:11

Dan J