【问题标题】:In NativeScript with Angular2 get element value在带有 Angular2 的 NativeScript 中获取元素值
【发布时间】:2017-01-23 14:49:58
【问题描述】:

我有一个列表,我想获取列表项的值。

视图如下

<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>

在打字稿中我有以下内容

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){

    }
}

我可以执行以下操作来获取值

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

这将获得数组中的值。但这只会返回数组中的值。

正如您在视图中看到的,我将字符串 Value is 附加到值中。

那么我怎样才能访问被点击的标签的text 属性。

【问题讨论】:

    标签: nativescript angular2-nativescript


    【解决方案1】:

    您可以通过 args.view 访问您的项目模板的视图。从那时起,我假设您的列表项中会有不同的文本,因此通过绑定(使用 Angular 索引)为每个标签创建唯一 ID 非常重要。因此,您可以执行以下操作:

    <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>
    

    然后在你的 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
    }
    

    【讨论】:

    • 我只有一个标签。即使 id 不是基于索引,我也会得到文本值。
    • 添加到这个 id 是基于角度绑定..但不是基于索引。所以我用[id]="'lbl'" 代替了这个`[id]="'lbl' + i"`,它仍然有效。这个id="lbl" 也可以使用
    • 好吧,只要您的模板使用相同的文本,它就会按预期工作......但是,拥有多个具有相同 id 的项目是违反所有规则的(这就是将要发生的事情如果您不使用索引创建唯一 ID)。例如,如果您的列表使用 itemTemplates 并且有 10 个项目..所有项目都将具有相同的 id - 您将如何获得第三个?
    • 是的,很好的解释..谢谢
    • @NickIliev 但是当我想到它时,Label 也继承自 view ,那么为什么它不会在 console.log(args.view); 中显示 Label 而在 StackLayout(265) 中显示?
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多