2016-04-15 13 views
6

angular2のhtml要素でモデルにアクセスする必要があります。私の場合、ng2-dragulaを使用してドラッグアンドドロップを実行し、そのサービスはドラッグされるhtml要素にのみアクセスできます。そして、要素の対応するモデルを更新する必要があります。問題はgithubにあります。angular2のhtml要素でモデルを取得

+1

あなたには、いくつかのコンポーネントのプロパティを意味するのですか?いくつかのコードが役に立ちます(Plunkerが優先)。 –

+0

@MarkRajcokコードはgithubにあります。リンクは質問の最後です。私はこの要素を表示させるangular2モデルを意味しました。コードを確認した後に明確でない場合はお知らせください。 –

+0

私は "HTML要素からコンポーネント"へ行く方法を知らないです - つまり、HTMLを指定すると、そのHTML要素が使用されているコンポーネントへの参照を取得する方法がわかりません...コンポーネントそのテンプレートにはHTML要素があります。 –

答えて

0

ngForが配列からコンパイルされている場合は、bag要素にdragulaModel属性を設定してモデルを提供する必要があります。あなたが項目位置を直すたび

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

そして、モデルが同期されます。あなたのコンポーネントでは、これを行うことで、簡単に更新されたモデルを得ることができます。

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

モデル内のアイテムの位置が変更されていることがわかります。

+1

移動しているアイテムを一義的に伝える方法はありませんか? – Umagon

2

サブスクリプションの引数で指定されたelementListelementのインデックスを検索すると、商品のモデルが表示されます。

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

を参照してください。

UPDATE:簡素化(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あなたがdragulaに渡すリストを保存変数です。 (例えば:[dragulaModel]="items")。

もっと簡単な方法があればいいですね。あなたがそれを見つけたら教えてください!

古い方法:

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:簡素化中にエラーが発生しました。

+1

同じ方法のより単純な形式:indexOfを使用するhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf – Dracco

+0

これからモデルを取得することはできません。 html要素への参照のみ –

+0

申し訳ありませんが、シンプルフォームにはエラーがありました。私は今それを修正した。 – Umagon

0

el.childrenは必ずES6アレイにラップしてください。

let i = el.children.indexOf(e) 

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

にする必要があり、私も親リストからインデックスに子要素を取得するには、予期しない結果を生成し、時には新しい未定義のアイテムを生成したことがわかりました。

代替直接IDソリューション: "要素のモデル" とは、

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

、その後onDrop方法で

console.log(e.id); 
関連する問題