无法从$ upload访问$ scope变量

时间:2014-04-04 16:41:18

标签: angularjs angularjs-scope

我对AngularJS很新,我需要实现一个多文件上传器。

我使用danialfarid/angular-file-upload并且上传效果很好。但是,在使用当前上传进度更新$ scope.selectedFiles时,我遇到了问题。

以下是我的代码片段:

angular.module('myApp', ['angularFileUpload', 'ui.bootstrap']);   
var MyCtrl = [ '$scope', '$upload', function($scope, $upload) {

    // ...

    // This array store multiple files the user wants to upload     
    $scope.selectedFiles = [];

    // Here the upload happens      
    $scope.uploadFiles = function() {
        var files = $scope.selectedFiles;
        for (var i = 0; i < files.length; i++) {
            var file = files[i].fileObject;
            $upload.upload({
                    //...
            }).progress(function(evt) {
                // p === current progress, this is working fine
                var p = parseInt(100.0 * evt.loaded / evt.total));
                // HERE IS THE ISSUE
                // $scope.selectedFiles === undefined
                // I need to find out a way to update $scope.selectedFiles[i].progres with the current progress....
                var p = parseInt(100.0 * evt.loaded / evt.total);
                console.log('$scope.selectedFiles: ' + $scope.selectedFiles); //[object Object]
                console.log('$scope.selectedFiles[i]: ' + $scope.selectedFiles[i]); //undefined
                console.log('$scope.selectedFiles[i].progress: ' + $scope.selectedFiles[i].progress); //Error: $scope.selectedFiles[i] is undefined
                $scope.selectedFiles[i].progress = p;
            })
        // ...

任何帮助?

由于

1 个答案:

答案 0 :(得分:1)

$scope.selectedFiles真的是undefined吗?看起来可能是使用循环变量i导致$scope.selectedFiles[i]未定义。在您遇到问题时,ifiles.length,当用作索引时,它超出了数组的范围。

尝试将上传文件代码提取到函数中,以便它对循环中的变量形成一个正确的闭包...

$scope.uploadFiles = function() {
    var files = $scope.selectedFiles;
    for (var i = 0; i < files.length; i++) {

        uploadFile(files[i]);

    // ...

function uploadFile (selectedFile) {
    var file = selectedFile.fileObject;
    $upload.upload({
            //...
    }).progress(function(evt) {
        var p = parseInt(100.0 * evt.loaded / evt.total));
        selectedFile.progress = p;
    });
}