2016-04-15 14 views
6

Modele html öğesiyle açısal2'de erişmem gerekiyor. Benim durumumda sürükle-bırak işlemini gerçekleştirmek için ng2-dragula kullanıyorum ve servisi sadece sürüklenen html öğelerine erişebiliyor. Ve elemanın ilgili modelini güncellemem gerekiyor. Sorun, github numaralı telefondan.angular2'de html öğesiyle model al

+1

içinde bazı bileşenin özelliklerini anlama geliyor? Bazı kodlar yardımcı olur (Plunker tercih edilir). –

+0

@MarkRajcok Kod github'ta, bağlantının sonunda soru var. Bu elementi oluşturan angular2 modelini kastettim. Kodu kontrol ettikten sonra açık değilse bana bildirin. –

+0

"HTML elemanından bileşene" gitmenin herhangi bir yolunun farkında değilim - yani, bir HTML verildiğinde, bu HTML öğesinin kullanıldığı bileşenle ilgili bir referansın nasıl alınacağını bilmiyorum ... bileşen şablonu bu HTML öğesine sahip. –

cevap

0

Eğer ngFor'unuz bir diziden derlenmişse, torba elemanındaki dragulaModel özniteliğini ayarlayarak model sağlamanız gerekir. Eğer ürün yeniden konumlandırmak zaman

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

Ve model senkronize edilir. Bileşeninizde, güncelleştirilmiş modeli kolayca yapabilirsiniz.

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

Öğelerin, modelinizde yeniden konumlandırıldığını göreceksiniz.

+1

Hangi öğenin taşınmadığını açıkça belirtmenin bir yolu yok mu? – Umagon

2

Öğenizin modelini, aboneliğin bağımsız değişkenleri tarafından sağlanan element dizini için elementList dizininde arayarak alabilirsiniz.

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

See?

GÜNCELLEME: Basitleştirme (Dracco sayesinde)

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 Eğer dragula geçmek listesini depolamak değişkendir. (ör. [dragulaModel]="items").

Keşke daha basit bir yol vardı. Bir tane bulursan söyle!

Eski yol:

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 
} 

DÜZENLEME: basitleştirme bir hata vardı.

+1

Aynı şekilde daha basit bir biçim: indexOf kullanın https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf – Dracco

+0

Model bu durumdan alamıyorum. Sadece html öğelerine yapılan referanslar –

+0

Üzgünüm, Basitleştirilmiş formda bir hata oluştu. Şimdi tamir ettim. – Umagon

0

el.children'i bir ES6 Dizisinde sardığınızdan emin olun.

let i = el.children.indexOf(e) 

Ben de ebeveyn listeden indeksi çocuk eleman alınırken öngörülemeyen sonuçlar üretmiştir ve bazen yeni tanımsız öğeler yarattığı ortaya çıktı

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

olmalı.

Alternatif Doğrudan Kimliği Çözüm:

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

ve ardından "öğesinin modeli" ile ondrop yöntemiyle

console.log(e.id);