2016-04-15 10 views
6

Ich muss auf das Modell durch das HTML-Element in angular2 zugreifen. In meinem Fall benutze ich ng2-Dragula, um Drag & Drop durchzuführen und der Dienst hat nur Zugriff auf die gezogenen HTML-Elemente. Und ich muss das entsprechende Modell des Elements aktualisieren. Heres das Problem bei github.Get-Modell von HTML-Element in angular2

+1

Mit "Modell des Elements" meinen Sie einige Eigenschaften der Komponente? Irgendein Code würde helfen (Plunker bevorzugt). –

+0

@MarkRajcok Der Code ist bei Github, der Link ist am Ende der Frage. Ich meinte das angular2-Modell, das dieses Element erscheinen lässt. Lassen Sie es mich wissen, wenn es nach der Überprüfung des Codes nicht klar ist. –

+0

Ich bin mir nicht bewusst, wie ich "vom HTML-Element zur Komponente" gehen kann, dh bei einem HTML-Code weiß ich nicht, wie ich einen Verweis auf die Komponente bekomme, wo das HTML-Element verwendet wird ... die Komponente wessen Vorlage hat dieses HTML-Element. –

Antwort

0

Wenn Ihr ngFor aus einem Array kompiliert wurde, müssen Sie ein Modell bereitstellen, indem Sie das Attribut tugulaModel für das Element bag festlegen.

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

Und wenn Sie neu zu positionieren die Elemente, wird das Modell synchronisiert werden. In Ihrer Komponente können Sie das aktualisierte Modell auf einfache Weise erhalten.

this.dragulaService.drop.subscribe((value) => { 
     //let [bagName, e, el] = value; 
     console.log(this.items); 
    }); 

Sie werden feststellen, dass die Artikel in Ihrem Modell neu positioniert werden.

+1

Gibt es keine Möglichkeit, eindeutig zu sagen, welcher Gegenstand bewegt wird? – Umagon

2

Sie können das Modell Ihres Artikels erhalten, indem Sie nach dem Index element in elementList suchen, der von den Argumenten des Abonnements bereitgestellt wird.

dragulaService.drop.subscribe(e => this.onDrop(e.slice(1))); 

Sehen Sie?

UPDATE: Vereinfachung (Dank Dracco)

private onDrop(args) { 

    let [e, el] = args; //element, elementList 
    let i = el.children.indexOf(e), 
    item = i+1? this.items[i] : null; 

    console.log(item); //The item 
} 

this.items ist die Variable, in dem Sie die Liste speichern Sie dragula passieren. (z.B. [dragulaModel]="items").

Ich wünschte, es gäbe einen einfacheren Weg. Sag mir, wenn du eins findest!

Alte Art und Weise:

private onDrop(args) { 

    let [e, el] = args; //element, elementList 
    let item; 
    for(let i in el.children){ 
     if(el.children[i]==e){ 
      item = this.items[+i]; 
      break;     
     } 
    } 

    console.log(item); //The item 
} 

EDIT: die Vereinfachung hatte einen Fehler.

+1

Einfachere Form des gleichen Wegs: benutze indexOf https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf – Dracco

+0

Ich kann das Modell nicht von diesem erhalten. Nur Verweise auf HTML-Elemente –

+0

Entschuldigung, das simplied Formular hatte einen Fehler. Ich habe es jetzt behoben. – Umagon

0

Stellen Sie sicher, dass Sie el.children in ein ES6-Array einpacken.

let i = el.children.indexOf(e) 

Sollten seine

let i = Array.from(el.children).indexOf(e) 

Ich fand auch, dass mit dem Index von der übergeordneten Liste erzeugte unvorhersehbare Ergebnisse und manchmal erzeugte neue undefinierte Elemente das untergeordnete Element abruft.

Alternative Direkt ID Lösung:

<ion-item *ngFor="let child of children" [id]="child"></ion-item> 

und dann in der onDrop Methode

console.log(e.id); 
Verwandte Themen