如何删除 Phonegap NFC 插件中的“标签侦听器”

How to remove a `tag listener` in Phonegap NFC plugin

我正在使用 chariotsolution 的 phonegap 的 nfc 插件 (https://github.com/chariotsolutions/phonegap-nfc),在我需要 移除监听器 之前,它一切正常。我做不到,它似乎不起作用。

我的问题是,这是一个常见错误吗?有没有人试过移除监听器并成功了?如果是这样,你是怎么做到的?

我使用了 addTagDiscoveredListenerremoveTagDiscoveredListener

添加监听代码

    var win = function() {
        showMessage({method:'alert',type:'warning',message:"Listening for NFC tags"});
        spinner.hide();
    }

    var fail = function() {
        swal("Fail", 'Failed to register NFC Listener', "error");
    }

    nfcevt = nfc.addTagDiscoveredListener(writeTag, win, fail);

删除侦听器的代码

nfc.removeTagDiscoveredListener(function() {
  console.log('callback here');
}, 
function() {
  console.log('success: removed');
}, 
function() {
  console.log('fail: not removed');
})

您必须使用 removeTagDiscoveredListener() 删除您之前注册的回调函数 addTagDiscoveredListener() 所以如果您有,

nfcevt = nfc.addTagDiscoveredListener(writeTag, win, fail);

那么writeTag一定是你注册的回调函数,所以你再用这个去掉:

nfc.removeTagDiscoveredListener(writeTag,
                                function() { console.log('success: removed'); },
                                function() { console.log('fail: not removed'); });

尝试删除之前未注册的内联函数毫无意义。


即使为无效回调(事件侦听器)调用 removeTagDiscoveredListener(),phonegap-nfc.js 调用的代码应该会阻止事件被触发(即使最初注册的回调仍然注册事件侦听器本身)。但是,至少在 Android 上,插件 总是 注册 TAG_DISCOVERED 意图,这反过来会导致标记发现的侦听器被触发。无论注册的事件侦听器如何,都会完成此操作。但是,有(当前未使用且无法从 JavaScript 层访问)代码表明此行为将来可能会改变。

根据 Michael Roland 的回答,我对它的工作原理有了更好的理解,因此我构建了一个函数来管理我的 NdefListener 回调。

var currentListenerCallback; //global, this one is.

function replaceCurrentNdefListener(newCallback) {
    nfc.removeNdefListener(
        currentListenerCallback, 
        function() {
            console.log('successfully removed listener callback: writeTag()');

            currentListenerCallback = newCallback; //make the new callback the current callback

            nfc.addNdefListener (
                currentListenerCallback,
                nfcwin, nfcfail);
        }, 
        function() {
            console.log("error: " + "unable to remove listener callback");   
        });
}

function nfcwin() {
   console.log("Success. Waiting for NFC Tag...")
}
function nfcfail(error) {
   console.log("Error adding NDEF Listener " + JSON.stringify(error))
}

基本上,我创建了一个全局变量来保存标签侦听器的当前回调。然后该函数将接收替换回调并自动删除 currentListenerCallback 并将 newCallback 作为新的 currentListenerCallback。然后该函数使用新的 currentListenerCallback.

添加一个新的 NdefListener

希望这对以后的人有所帮助。编码愉快!