回调函数变化不影响UI

Callback function changes do not affect UI

Angular 5.2.0 和 TypeScript 2.6.2.

我正在使用 following plugin 读取 NFC 标签。当用户按下按钮时监听器启动。

<button (tap)="doStartNdefListener()" text="Get NFC"></button>
<Label [text]="nfcText" textWrap="true"></Label>

问题 - 即使 doStartNdefListener() 中的回调成功扫描标签,将输出保存在 nfcText,从回调中输出值,即使 nfcText 的值已更改,它也不会更新 UI.

import { Component } from "@angular/core";
import { Nfc, NfcTagData, NfcNdefData } from "nativescript-nfc";

export class StartComponent { 
public nfc: Nfc;
public nfcText: string;

constructor(){
    this.nfc = new Nfc();
}

public doStartNdefListener() {
    this.nfc.setOnNdefDiscoveredListener((data: NfcNdefData) => {
        if (data.message) {
            let tagMessages = [];
                data.message.forEach(record => { 
                    tagMessages.push(record.payloadAsString); });

                console.log(tagMessages.join(", "));
                this.nfcText = tagMessages.join(", ");
                console.log(this.nfcText);
            }
        },
        { stopAfterFirstRead: true, scanHint: "Scan the tag!" })
        .then(() => this.nfcText = "Listening for tag")
        .catch(err => alert(err));
    }
}

两个控制台输出打印出扫描的 NFC 标签值,但标签没有更新。

编辑:

有趣的是 UI 在我 运行 doStartNdefListener() 函数后执行另一个函数后更新。

尝试将其包装到 $timeout 块中。

$timeout(()=> {
     this.nfcText = tagMessages.join(", ");
}, 100);

这将强制执行摘要循环,让您的 UI 注意到更改。

你试过下面的方法了吗?

<Label> {{nfcText}} </Label>

我不记得标签上是否存在可以绑定的文本 属性,但可以肯定的是,您可以使用字符串插值将文本输出到视图。

@rgantla,问题是 Angular 不考虑更改(不刷新标签)。所以,做一个函数

private changeNfcText (message:string) {
            this.ngZone.run(()=>{
              this.nfcText = message;
             });
        }
    }

然后,

this.nfc.setOnNdefDiscoveredListener((data: NfcNdefData) => {
        if (data.message) {
            let tagMessages = [];
                data.message.forEach(record => { 
                    tagMessages.push(record.payloadAsString); });

                console.log(tagMessages.join(", "));
                this.changeNfcText(tagMessages.join(", ")); //<--call the function
                console.log(this.nfcText);
            }
        },
        { stopAfterFirstRead: true, scanHint: "Scan the tag!" })
        .then(() => this.changeNfcText("Listening for tag")) //<--call the function
        .catch(err => alert(err));
    }