2015-02-19 2 views
0

I'm с помощью PhoneGap-плагин для чтения идентификатора NFC-теги и хотите использовать эту внутреннюю часть .factoryКак обрабатывать обратный вызов в услугах AngularJS

Так что это делает:

Внутри моего .factory я вызываю команду «nfc.addTagDiscoveredListener», которая регистрирует прослушиватель событий для NFC-тегов. При успехе он вызывает функцию holeNfc и должен запускать nfcevent.

На самом деле моя функция 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; 
 
     } 
 
    });

Я также попробовал то же самое внутри моего контроллера и там он работает без проблем:

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"; 
 
      } 
 
     ); 
 
    });

Мой контроллер:

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>

ответ

1

кажется, что вы вызываете вашу функцию на вашем первом фрагменте. И на самом деле вы должны просто передать его как параметр.

Просто сделайте переход от 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; 
      } 
     ); 

EDIT Изменение автокрепеж Что-то вроде этого было бы лучше.

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; 
      } 
     ); 

    } 
}); 

И в вашем контроллере вы могли бы сделать что-то подобное тому, что вы делали раньше на чтения значения:

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

Разница заключается в том, этот плагин, кажется, продолжают называть свой код после регистрации с ним, так вы действительно должны просто вызвать initNfc один раз, так как он даже может продолжать называть ваш код 2 или 3 раза каждый раз, когда он что-то читает.

+0

Я люблю тебя !!!! Вы не знаете, сколько времени я потратил впустую с этим. – Idur

+0

haha ​​... Ненавижу, когда мне не хватает маленькой детали как это! –

+0

Может быть, вы можете мне помочь еще раз:) ... Осталась одна проблема. Когда я вызываю версию в своем контроллере, мне нужно только один раз нажать мою кнопку и прочитать один тег за другим, но когда я поместил его на свою фабрику, я должен все время нажимать кнопку, чтобы читать теги nfc. Я обновил свой код выше. – Idur

Смежные вопросы