如何删除Phonegap NFC插件中的`标签监听器`

时间:2015-05-20 10:46:20

标签: cordova callback phonegap-plugins nfc

我正在使用chariotsolution的nfc插件来获取phonegap(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');
})

2 个答案:

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

希望这可以帮助将来的某个人。快乐的编码!