在读取第二个值之前,如何禁用NFC EventListener?

时间:2018-11-07 13:16:09

标签: javascript angular typescript ionic-framework

此问题来自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 = "";
  }

2 个答案:

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