如何添加Angular $ http事件侦听器

时间:2013-04-15 19:44:51

标签: angularjs

我目前正在使用...

在angular指令中上传文件
var fd = new FormData();
fd.append("uploadedFile", scope.uploadedFile);

var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListenter("load", uploadComplete, false);
xhr.addEventListenter("error", uploadFailed, false);
xhr.addEventListenter("abort", uploadCanceled, false);
xhr.open("POST", scope.postUrl);
scope.uploadInProgress = true;
xhr.send(fd);

function uploadProgress(e){
  scope.$apply(function(){
    if(e.lengthComputable){
      scope.progress = Math.round(e.loaded * 100 / e.total);
    } else {
      scope.progress = 'unable to compute';
    }
  });
 }

 ...

可以使用$ http提供程序重构此代码段吗?我无法弄清楚如何保留我的事件监听器。

2 个答案:

答案 0 :(得分:3)

简短回答:很快你就可以了,但还没有完全按照你的要求。

有几个选项正在讨论构建功能 - 暴露基础xhr对象,或允许为方法设置回调。

具体见https://github.com/angular/angular.js/issues/1934 - 目前进展事件不起作用。

与此同时,我建议您手动创建对象并使用$apply更新范围,就像您一样。

有关如何使用服务设置至少可以捕获的开始和停止事件的更多详细信息,请参阅此问题 - 但在进度上没有运气。

AngularJS: need to fire event every time an ajax call is started

答案 1 :(得分:1)

现在您可以使用简单/轻量级的angular-file-upload指令,并支持文件删除和上传进度。 它使用一个垫片在角度之前加载,以便能够以角度访问XHR私有对象并将上传事件监听器附加到它。

<div ng-controller="MyCtrl">
  <input type="file" ng-file-select="onFileSelect($files)" multiple>
</div>

JS:

//inject angular file upload directive.
angular.module('myApp', ['angularFileUpload']);

var MyCtrl = [ '$scope', '$upload', function($scope, $upload) {
  $scope.onFileSelect = function($files) {
    for (var i = 0; i < $files.length; i++) {
      var $file = $files[i];
      $upload.upload({
        url: 'my/upload/url',
        file: $file,
        progress: function(evt){
           $scope.progress = parseInt(100.0 * evt.loaded / evt.total);
        }
      }).then(function(data, status, headers, config) {
        // file is uploaded successfully
        console.log(data);
      }); 
    }
  }
}];