Javascript AngularJS ng点击服务和承诺

Javascript AngularJS ng点击服务和承诺,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我一直是AngularJS的初学者,对。。。 我想做的几乎很简单——视图中的一个按钮触发条形码扫描,扫描完成后,用扫描结果填充视图字段 他认为: <button id="ajouter-button3" class=" button button-positive button-block " ng-click="scanBarCode()">Scanner</button> <label class="item item-input " id=

我一直是AngularJS的初学者,对。。。 我想做的几乎很简单——视图中的一个按钮触发条形码扫描,扫描完成后,用扫描结果填充视图字段

他认为:

<button id="ajouter-button3" class=" button button-positive  button-block " ng-click="scanBarCode()">Scanner</button>
        <label class="item item-input " id="add-ean" name="ean">
            <span class="input-label">EAN</span>
            <input type="text" placeholder="Code EAN" name="add.ean" ng-model="add.ean" value="{{add.ean}}">
        </label>
在services.js中,希望在扫描完成后延迟获得承诺,但是。我不明白延迟/承诺/功能是如何协同工作的,我尝试了以下方法:

.factory("ScanService", ["$q", "ScanDatas","$cordovaBarcodeScanner", function ($q, ScanDatas, $cordovaBarcodeScanner) {
var scan = {};

var scanBarCode = function(){
    var readDatas = {};

    $cordovaBarcodeScanner.scan().then(function(datas){
        readDatas.text = datas.text;
        readDatas.format = datas.format;
        readDatas.cancelled = datas.cancelled;
        readDatas.processed = true;
    },function(error){
        readDatas.error = true;
    });

    return readDatas;
}

var getBarcodeData = function(){
    var deferred = $q.defer();

    deferred.resolve(scanBarCode());

    return deferred.promise;
};

return {
    getBarcodeData: getBarcodeData
}
}])

当我运行应用程序时。。。日志会在
$scope.scanBarCode
中立即激发,而我预期
控制台.log
只会在
延迟后激发。resolve
承诺。我不明白为什么会发生这种情况。

将此作为您的服务:

.factory("ScanService", ["$q", "ScanDatas","$cordovaBarcodeScanner", function ($q, ScanDatas, $cordovaBarcodeScanner) {
  var scan = {
    scanBarCode : function(){
      var deferred = $q.defer();
      var readDatas = {};
      $cordovaBarcodeScanner.scan().then(function(datas){
          readDatas.text = datas.text;
          readDatas.format = datas.format;
          readDatas.cancelled = datas.cancelled;
          readDatas.processed = true;
          deferred.resolve(readDatas);
      },function(error){
          readDatas.error = true;
      });

      return deferred.promise;
    }
  };

  return scan;
}]);
从控制器中调用它,如下所示:

$scope.scanBarCode = function(){
    ScanService.scanBarCode().then(function(datas){
        console.log("Retour de la méthode d'acquisition");
        $scope.add.ean = datas.text;
    })
};

谢谢

将此作为您的服务:

.factory("ScanService", ["$q", "ScanDatas","$cordovaBarcodeScanner", function ($q, ScanDatas, $cordovaBarcodeScanner) {
  var scan = {
    scanBarCode : function(){
      var deferred = $q.defer();
      var readDatas = {};
      $cordovaBarcodeScanner.scan().then(function(datas){
          readDatas.text = datas.text;
          readDatas.format = datas.format;
          readDatas.cancelled = datas.cancelled;
          readDatas.processed = true;
          deferred.resolve(readDatas);
      },function(error){
          readDatas.error = true;
      });

      return deferred.promise;
    }
  };

  return scan;
}]);
从控制器中调用它,如下所示:

$scope.scanBarCode = function(){
    ScanService.scanBarCode().then(function(datas){
        console.log("Retour de la méthode d'acquisition");
        $scope.add.ean = datas.text;
    })
};

谢谢

尝试这种方法,但当我运行时,get:ionic.bundle.js:25642错误:[$injector:undef]提供程序“ScanService”必须从$get factory方法返回一个值。我想我错过了一些东西尝试这种方法,但是当我运行时,get:ionic.bundle.js:25642错误:[$injector:undef]提供程序“ScanService”必须从$get factory方法返回一个值。我想我错过了什么