2017-01-23 30 views
0

Ich habe eine Liste, und ich möchte den Wert des Listenelements erhalten.In NativeScript mit Angular2 erhalten Element Wert

Der Blick ist wie folgt

<ListView [items]="myItems" (itemTap)="onItemTap($event)"> 
<template let-item="item" let-i="index" let-odd="odd" let-even="even"> 
    <StackLayout [class.odd]="odd" [class.even]="even"> 
     <Label #myFoo id="grocery-list" [text]='"Value is: " + i'></Label> 
    </StackLayout> 
</template> 

In Typoskript ich habe folgendes

import { Component,ViewChild,ElementRef } from "@angular/core"; 
import {topmost} from "ui/frame"; 
import {ListView} from "ui/list-view"; 
export class AppComponent { 

@ViewChild("myFoo") myFooRef: ElementRef; 

    public myItems = []; 
    constructor() { 
      this.myItems.push("1"); 
      this.myItems.push("2"); 
      this.myItems.push("3"); 

    } 

    onItemTap(event){ 

    } 
} 

Ich kann das den Wert

onItemTap(event){ 
    let itemValue = this.myItems[event.index]; 
    console.log(itemValue);  
    } 

Dies tun folgende bekommen wird bekommen der Wert im Array. Aber dies wird nur den Wert im Array zurückgeben.

Wie Sie in der Ansicht sehen können, habe ich die Zeichenfolge Value is an den Wert angehängt.

Wie kann ich also auf die Eigenschaft text des Labels zugreifen, die angezapft wird.

Antwort

3

Sie können auf die Ansicht Ihrer Artikelvorlage über args.view zugreifen. Von diesem Punkt an gehe ich davon aus, dass Sie in Ihren Listenelementen einen anderen Text haben werden. Daher ist es wichtig, für jede Marke eindeutige IDs über die Bindung zu erstellen (über den Angular-Index). So können Sie wie folgt vorgehen:

<ListView [items]="myItems" (itemTap)="onItemTap($event)"> 
    <template let-item="item" let-i="index" let-odd="odd" let-even="even"> 
     <StackLayout [class.odd]="odd" [class.even]="even"> 
      <Label [id]="'lbl' + i" [text]='"Value is: " + i'></Label> 
     </StackLayout> 
    </template> 
</ListView> 

und dann in Ihrem onItemTap

public onItemTap(args: ItemEventData) { 
    console.log("Item Tapped at cell index: " + args.index); 
    console.log(args.object); // prints something like ListView(137) 
    console.log(args.view); // prints something like StackLayout(265) 

    var lbl = <Label>args.view.getViewById("lbl" + args.index); 

    console.log(lbl.text); // prints the actual text of the tapped label 
} 
+0

Ich habe ein einziges Etikett. Ich bekomme den Textwert, auch wenn die ID nicht auf Index basiert. – krv

+0

Hinzufügen zu diesem die ID basierte auf eckigen Bindung ..aber nicht index basiert. also habe ich '[id] =" 'lbl' "' anstelle von diesem '[id] =" 'lbl' + i "' und es funktioniert immer noch. Auch dieses 'id =" lbl "' funktioniert genauso gut – krv

+1

Nun es würde wie erwartet funktionieren, solange Ihre Vorlagen den gleichen Text verwenden ... immer noch ist es gegen alle Regeln, mehrere Elemente mit der gleichen ID zu haben (was ist was passiert, wenn Sie keine eindeutigen IDs mit dem Index erstellen). Zum Beispiel, wenn Ihre Liste itemTemplates verwendet und 10 Elemente hat, haben alle die gleiche ID - wie bekommen Sie die dritte? –

Verwandte Themen