2017-11-29 1 views
1

Ich habe eine einfache Todo-Liste mit *ngFor generiert, und ich versuche, li 's offsetTop Wert zu bekommen. Ich kann das für das erste generierte li gut machen, aber ich muss in der Lage sein, eine Variable auf jedes der li und ihrer Attribute zu setzen. Gibt es eine Form der Indexierung, die ich mit Vorlagenvariablen verwenden kann, um einen "This" -Effekt zu erzielen?Referenzieren Element Attribute von generierten li in Angular4

Meine Vorlage:

<li class="search-item" #todoli 
    *ngFor="let todoItem of todos; let item=index " 
    (click)="selectTodo($event, todoItem)" 
> 
    <span class="todo-item">{{ todoItem.name }}</span> 
    <span class="delet-todo" (click)="deleteTodo(item)">&#10005;</span> 
</li> 

Meine Komponente TS (auf den Code, der das Verkürzte @ViewChild Ziel verwendet):

li: any; 

    @ViewChild("todoli") 
    todoli; 

    selectTodo(event, i) { 
    this.selectedItem = i; 
    this.li = this.todoli.nativeElement; 
    console.log(this.li.offsetTop); 
    } 

Antwort

4

Sie können es auch tun, ohne ViewChild/ViewChildren Referenzen:

<li class="search-item" #todoli 
    *ngFor="let todoItem of todos; let item=index " 
    (click)="selectTodo($event, todoItem, todoli)" 
> 


selectTodo(event, i, todoli) { 
    this.selectedItem = i; 
    this.li = todoli; 
    console.log(this.li.offsetTop); 
} 

Stackblitz Example

oder ein Ereignis ohne Vorlage Referenzgröße durch event.target/currentTarget

<li class="search-item" 
    *ngFor="let todoItem of todos; let item=index " 
    (click)="selectTodo($event, todoItem)" 
> 


selectTodo(event, i) { 
    this.selectedItem = i; 
    this.li = event.target; 
    console.log(this.li.offsetTop); 
} 

Stackblitz Example

+0

Ich habe Angular heute fast aufgegeben, um herauszufinden, wie man Elemente referenziert. Danke, dass du nicht nur meine Frage beantwortet hast, sondern mir auch den einfachsten Weg gezeigt hast, um zu bekommen, was ich brauche! Ich werde jetzt über das $ Event nachlesen, es scheint mir der Punkt zu sein, den ich vermisst habe. – Draxy

2

ViewChild soll ein einzelnes Kind abzufragen. ViewChildren sollte die Abfrage mehrere Kinder verwendet werden:

@ViewChildren("todoli") 
    todolis: QueryList<any>; 

Wo todoli Vorlage Variablenname, und todolis ist QueryList Objekt.

+1

@BenediktSchmidt Warum bieten Sie private Felder an? – yurzui

+0

Weil ich versucht habe, das ViewChildren in meinem eigenen Projekt zu verwenden, um zu überprüfen, ob das funktioniert und als ich die Liste ausgedruckt habe, sah ich, dass das Feld das Array enthielt. Ich bin mir nicht sicher, ob dies eine schlechte Praxis, aber ich dachte nur, es funktioniert so warum nicht –

+0

@BenediktSchmidt Es soll mit ToArray() zugegriffen werden oder mit anderen QueryList-Methoden – estus

Verwandte Themen