此问题来自NFC标签过于敏感。 当我放置一个NFC标签一次时,会立即输入太多值。 因此,如果输入了一个NFC标签值,则希望此时停止NFC事件监听器。我该如何实施?
我认为设备和NFC标签之间的NFC读取速度比程序端的EventListener取消要快。
此信息页面的工作方式如下...
* 1)首先加载ionViewDidEnter()
2)添加addListenNFC()
3)如果使用NFC标签,则将值发送到onNfcLogin(tagId)
4)在onNfcLogin(tagId)中,“ Http post service provider”作为userService.nfclogin()包含在内
5)最后从服务器端获取json类型返回。*
{ “依赖关系”:{ “ ionic-native / core”:“ 4.7.0”, “离子角”:“ 3.9.2”, “ typescript”:“〜2.6.2”] }, “测试设备”:“ Galaxy8”, “ NFC标签”:“廉价的NFC棒” }
ionViewDidEnter() {
this.nfc.enabled().then((resolve) => {
this.addListenNFC();
}).catch((reject) => {
alert("NFC is not supported by your Device");
});
}
addListenNFC() {
this.nfc.addTagDiscoveredListener().subscribe(data => {
//window.removeEventListener; //this is not working.
if (data && data.tag && data.tag.id) {
this.tagId = this.nfc.bytesToHexString(data.tag.id);
if (this.tagId) {
this.scanned = true;
this.onNfcLogin(this.tagId);
} else {
alert('NFC_NOT_DETECTED');
}
}
});
}
onNfcLogin(tagId) {
this.userService.nfclogin(tagId).subscribe(data => {
// "this.userService.nfclogin()" is at Http post service provider
this.getData = JSON.stringify(data);
if (this.getData) {
this.granted = true;
this.loading.dismiss();
this.events.publish('user:login');
this.navCtrl.setRoot(HomePage);
}
this.resetScanData;
},
error => {
this.loading.dismiss();
this.showError(error);
});
}
showError(error) {
console.log(error);
let alert = this.alertCtrl.create({
title: 'Login Error',
message: error.json().message,
buttons: ['OK']
});
alert.present();
}
resetScanData() {
this.granted = false;
this.scanned = false;
this.tagId = "";
}
答案 0 :(得分:1)
您只能通过observable.take(1).subscribe(...)获得第一个订阅。
然后稍后重新创建订阅。
答案 1 :(得分:0)
我用这段代码解决了。
this.myListener = this.nfc.addNdefListener(() => {
console.log(‘successfully attached ndef listener’);
},(err) => {
console.log(‘error attaching ndef listener’, err);
}).subscribe((event) => {
. . .
});
//remove listener
this.myListener.unsubscribe();
感谢Ionic论坛中的Avdm。 https://forum.ionicframework.com/t/remove-listener-nfc-plugin/113393