我正在使用chariotsolution的nfc插件来获取phonegap(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');
})
答案 0 :(得分:2)
您必须使用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层访问)代码表明此行为将来可能会发生变化。
答案 1 :(得分:1)
根据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。
希望这可以帮助将来的某个人。快乐的编码!