2016-03-31 17 views
0

バーコードスキャンを検出するコードがあります。それはAngularJSコントローラの中にあったときに働いていました。他のコントローラーもそのコードを使用する必要があったので、スキャンコードを別のJSファイルに入れて、両方を使用できるようにしました。私の研究によると、HTMLファイルにJSファイルを含めると、別のJSファイルを呼び出すことができます。私はそれをやった。スキャンコードがスキャンを検出した後、しかし、それは他のコントローラ上のメソッドを呼び出そうとしたが、私はこのエラーを取得:barcodeScan.jsでJavaScriptファイル内の関数をsetTimeoutで呼び出し、AngularJSを使用します。

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

:私のAngularJSコントローラで

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

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

何が欠けていますか?

注:私のコントローラコードがインデックスHTMLページに最初にリストされています

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

私は 'onBarcodeScan()は、'パブリックアクセスを持っていないと思います。それを公開するか、[角度サービス](https://docs.angularjs.org/guide/services)を使用して、複数のコントローラ間で共有することができます。 – Rohit416

+0

角度コントローラーで動作している場合は、なぜ** angular $ broadcast **を使用しないでください。それ以外の場合は、角度コントローラのコードを読み込み、この結果を変数のプレーンJavaScript関数で設定し、別のコントローラでその結果を再度取得します。それが動作します。 –

+0

タイムアウトを10秒に増やし、これがまだ発生するかどうかを確認します。読み込みの問題かもしれません。 – Niloct

答えて

0

私はusing events in an AngularJS factoryを説明したポストを見つけました。ここでは、作業コードは次のとおりです。

コントローラー:

scannerService.notify(); 

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

工場:

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; 
      }); 
     } 
    }; 
}]); 
関連する問題