javascript - 如何处理 AngularJS 服务中的回调

标签 javascript angularjs cordova

我正在使用 Phonegap-Plugin 读取 NFC 标签的 ID,并希望在 .factory 内部使用它

它是做什么的:

在我的 .factory 中,我调用命令“nfc.addTagDiscoveredListener”,该命令为 NFC 标签注册事件监听器。成功后,他调用函数holeNfc并应触发nfc事件。

事实上,我的函数holeNfc被调用,但nfcEvent不会到达。 进一步的结果是该行 --> tag = nfcEvent.tag;不会工作,因为他没有收到 nfcEvent。

代码:

app.factory('leseNfc', function($rootScope) {

        // Items exposed to other modules
        
        return {
           initNfc: initNfc
        };

        
      
       function initNfc() {
            var tag = '';
            var taglesen = '';

            function holeNfc(nfcEvent) {
                tag = nfcEvent.tag;
                taglesen = nfc.bytesToHexString(tag.id);
            }

            nfc.addTagDiscoveredListener(
                 holeNfc(),             // tag successfully scanned
                 function (status) {    // listener successfully initialized
                    msg = "NFC Reader ist ready";
                    //return msg;
                 },
                 function (error) {     // listener fails to initialize
                    msg = "NFC Reader ist nicht ready";
                    //return msg;
                 }
            );

            return taglesen;
        }
    });

我也在我的 Controller 中尝试了相同的操作,并且它可以正常工作:

app.controller('Page3Ctrl', function($scope, $rootScope, Data, leseNfc, Calc) {
        $scope.item = Data.selectedItem.title;

        

        $scope.save = function() {
            Data.selectedItem.title = $scope.item;
            $scope.ons.navigator.popPage();
        };

        $scope.readNfc = function(nfcEvent) {
            
            var tag = nfcEvent.tag;
            var taglesen = nfc.bytesToHexString(tag.id);
            $scope.$apply(function() {
                $scope.nfcvalue = taglesen;
            });
        };

        nfc.addTagDiscoveredListener(
             $scope.onNfc,             // tag successfully scanned
             function (status) {    // listener successfully initialized
                $scope.nfcok = "NFC Reader ist ready";
             },
             function (error) {     // listener fails to initialize
                $scope.nfcok = "NFC Reader ist nicht ready";
             }
        );
    });

我的 Controller :

app.controller('NFCCtrl', function($scope, $rootScope, Data, Calc, onNfc, leseNfc) {
        $scope.item = Data.selectedItem.title;

        

        $scope.save = function() {
            Data.selectedItem.title = $scope.item;
            $scope.ons.navigator.popPage();
        };

                   
        $scope.readnfc = function() {
            $scope.nfcvalue = leseNfc.initNfc();
        };

    });
<ons-page class="center">
    <div ng-controller="NFCCtrl">
        <ons-text-input ng-model="item" style="margin:10px;"></ons-text-input><br>
        <ons-text-input ng-model="nfcvalue" style="margin:10px;"></ons-text-input><br>
        <ons-button ng-click="save()">Save</ons-button>
        <ons-button ng-click="readnfc()">Nfc</ons-button>
    </div>
</ons-page>

最佳答案

您似乎是在第一个代码片段上调用您的函数。事实上,您应该将其作为参数传递。

只需将holeNfc() 更改为holeNfc

 nfc.addTagDiscoveredListener(
             holeNfc,             // tag successfully scanned
             function (status) {    // listener successfully initialized
                msg = "NFC Reader ist ready";
                //return msg;
             },
             function (error) {     // listener fails to initialize
                msg = "NFC Reader ist nicht ready";
                //return msg;
             }
        );

编辑更换工厂这样的东西会更好。

app.factory('leseNfc', function($rootScope) {

    // Items exposed to other modules

    return {
       initNfc: initNfc
    };



   function initNfc(callback) {


        function holeNfc(nfcEvent) {
            var tag = nfcEvent.tag;
            var taglesen = nfc.bytesToHexString(tag.id);
            callback(taglesen);


        }

        nfc.addTagDiscoveredListener(
             holeNfc,             // tag successfully scanned
             function (status) {    // listener successfully initialized
                msg = "NFC Reader ist ready";
                //return msg;
             },
             function (error) {     // listener fails to initialize
                msg = "NFC Reader ist nicht ready";
                //return msg;
             }
        );

    }
});

在您的 Controller 中,您可以执行与之前读取值类似的操作:

initNfc(function(taglesen){
     $scope.$apply(function() {
            $scope.nfcvalue = taglesen;
        });
);

不同之处在于,这个插件在您注册后似乎会不断调用您的代码,因此您实际上应该只调用 initNfc 一次,因为它甚至可以在每次读取内容时继续调用您的代码 2 或 3 次。

关于javascript - 如何处理 AngularJS 服务中的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28605350/

相关文章:

javascript - 找出有多少成千上万

javascript - 咕噜声 : Updating value in YAML file?

AngularJS - $scope.value 的重置不会改变模板中的值(随机行为)

android - Ionic Android Release 构建终止 HTTPS 请求

javascript - 在所有迭代完成之前调用 node.js async.each() 回调

javascript - Angularjs 允许用户仅输入数字和正斜杠(/)

javascript - 使用 ng-repeat 和 foundation accordion 的动画

android - 使用 phonegap 开发 Android 应用程序

android - Phonegap 3 插件导致构建错误或插件未初始化

javascript - 使用jQuery淡入淡出div onclick