2016-03-31 14 views
0

Ich habe einen Code, um einen Barcode-Scan zu erkennen. Es funktionierte, als es direkt in einem AngularJS-Controller war. Da ein anderer Controller diesen Code ebenfalls verwenden musste, legte ich den Scan-Code in eine separate JS-Datei, damit beide ihn verwenden konnten. Meine Recherchen zeigten, dass der Aufruf einer JS-Datei aus einer anderen funktionieren sollte, wenn ich sie in die HTML-Seite einfüge. Ich habe das getan. Aber nach dem Scan-Code einen Scan erkennt, versucht es, ein Verfahren auf dem anderen Controller anzurufen, aber ich bekomme diese Fehlermeldung:Funktion in einer JavaScript-Datei von einer anderen aufrufen, in einem setTimeout und mit AngularJS

0x800a1391 - JavaScript runtime error: 'onBarcodeScan' is undefined

In barcodeScan.js:

setTimeout(function() { 
    if (chars.length == 12) { 
     var barcode = chars.join(""); 
     onBarcodeScan(barcode); // Error occurs here 
    } 
    chars = []; 
    pressed = false; 
}, 500); 

In meinem AngularJS Controller:

var onBarcodeScan = function (barcode) { 
    $scope.$apply(function() { 
     $scope.state.userEnteredSubId = barcode; 
     $scope.onSubmitSubId(); 
    }); 
} 

Was fehlt mir?

Hinweis: Mein Controller-Code wird zuerst im Index HTML-Seite:

<script src="js/cassetteController.js"></script> 
<script src="js/barcodeScan.js"></script> 
+1

Ich denke 'onBarcodeScan()' nicht den Zugang der Öffentlichkeit haben. Sie müssen es offen legen, oder Sie können es über mehrere Controller freigeben, indem Sie einen [angular service] (https://docs.angularjs.org/guide/services) verwenden. – Rohit416

+0

Warum verwenden Sie ** angular $ broadcast **, wenn es im Winkelregler arbeitet. Ansonsten lesen Sie den Code im eckigen Controller und setzen Sie dieses Ergebnis durch einfache JavaScript-Funktion in Variable und in einem anderen Controller erhalten Sie dieses Ergebnis erneut. Es wird klappen. –

+0

Erhöhen Sie das Timeout auf zehn Sekunden und sehen Sie, ob dies noch immer geschieht. Kann ein Ladeproblem sein. – Niloct

Antwort

0

fand ich einen Beitrag, die using events in an AngularJS factory erklärt. Hier ist der Arbeitscode:

Controller:

scannerService.notify(); 

scannerService.subscribe($scope, function() { 
    // Handle notification 
    $scope.$apply(function() { 
     $scope.state.userEnteredSubId = $rootScope.scan; 
     $scope.onSubmitSubId(); 
    }); 
}); 

Factory:

app.factory('scannerService', ['$http', '$rootScope', function ($http, $rootScope) { 
    var listenerAdded; 

    return { 
     subscribe: function (scope, callback) { 
      var handler = $rootScope.$on('notifying-service-event', callback); 
      scope.$on('$destroy', handler); 
     }, 

     initialize: function() { 
      if (listenerAdded) { 
       return; 
      } 
      // From http://www.deadosaurus.com/detect-a-usb-barcode-scanner-with-javascript/: 
      listenerAdded = true; 
      var pressed = false; 
      var chars = []; 
      document.addEventListener('keydown', function (event) { 
       // Ignore this if the user is hitting enter, or any other non-number. 
       if (event.keyCode < 48 || event.keyCode > 57) { 
        return; 
       } 
       // Only capture numbers, because a subId is all numbers. 
       if (event.keyCode >= 48 && event.keyCode <= 57) { 
        // Note: Theys keycodes are only for numbers along the top of the keyboard; the number pad uses a different range. 
        chars.push(String.fromCharCode(event.keyCode)); 
       } 
       console.log(event.keyCode + ":" + chars.join("|")); 
       if (pressed == false) { 
        // The JS setTimeout method would cause us to have to use $scope.apply(). Instead, just use Angular's $timeout. 
        // http://jimhoskins.com/2012/12/17/angularjs-and-apply.html 
        setTimeout(function() { 
         if (chars.length == 12) { 
          var barcode = chars.join(""); 
          $rootScope.scan = barcode; 
          $rootScope.$emit('notifying-service-event'); 
         } 
         chars = []; 
         pressed = false; 
        }, 500); 
       } 
       pressed = true; 
      }); 
     } 
    }; 
}]); 
Verwandte Themen