如何删除 Phonegap NFC 插件中的“标签侦听器”
How to remove a `tag listener` in Phonegap NFC plugin
我正在使用 chariotsolution 的 phonegap 的 nfc 插件 (https://github.com/chariotsolutions/phonegap-nfc),在我需要 移除监听器 之前,它一切正常。我做不到,它似乎不起作用。
我的问题是,这是一个常见错误吗?有没有人试过移除监听器并成功了?如果是这样,你是怎么做到的?
我使用了 addTagDiscoveredListener
和 removeTagDiscoveredListener
。
添加监听代码
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
希望这对以后的人有所帮助。编码愉快!
我正在使用 chariotsolution 的 phonegap 的 nfc 插件 (https://github.com/chariotsolutions/phonegap-nfc),在我需要 移除监听器 之前,它一切正常。我做不到,它似乎不起作用。
我的问题是,这是一个常见错误吗?有没有人试过移除监听器并成功了?如果是这样,你是怎么做到的?
我使用了 addTagDiscoveredListener
和 removeTagDiscoveredListener
。
添加监听代码
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
.
希望这对以后的人有所帮助。编码愉快!