функция в операторе if не была определена только в первый раз, но во время отдыха также вызывается функция

0

Я пытаюсь проверить расширение файла перед использованием ng-upload, но в нормальном состоянии, которое проверяет, является ли файл ошибкой, я пытаюсь добавить свою функцию. Что-то очень странное случается. В первый раз, когда я попытался загрузить, я получил эту ошибку:

ReferenceError: extension_check не определен прикладной 9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 76141 в Object.forEach (прикладной 9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 26353) в Scope $ scope.uploadFiles (прикладной 9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 76140). На $ parseFunctionCall (приложение-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 38330) при обновлении (приложение-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 73683) при применении-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 73695 в прикладном 9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 42205 в completeOutstandingRequest (прикладной 9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 30920) при применении-9d9dfe26d056c7fe9da969ebdf1e1f7f.js: 31300

но во всех других случаях функция вызывает также

Код:

$scope.uploadFiles = function(files) {
    $scope.files = files;


    angular.forEach(files, function(file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
              url: 'http://172.18.139.3:3000/attachments',
              file: file

            });

            file.upload.then(function (response) {
              $timeout(function () {
                file.result = response.data;
                if (file.result.header.status["code"] == "ERROR") {

                    file.$error = true
                    $scope.message = file.result.header.status.message
                    console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                }

              });
            }, function (response) {
              if (response.status > 0)
                $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
              file.progress = Math.min(100, parseInt(100.0 * 
                                       evt.loaded / evt.total));
            });
        } 


        console.log(file)  
    });

    extension_check = function(name) {

        extension_allow = ['jpg','jpeg','bmp','png'];
        ext = name.substr(name.lastIndexOf('.')+1).toLowerCase();
        console.log (ext);
        flag = (extension_allow.indexOf(ext) > -1);
        console.log (flag);
        return flag;
    }

}
Теги:
file-upload

1 ответ

1

Поскольку в первый раз, когда цикл for выполняется, переменная extension_check не определена. Во второй раз, поскольку у вас есть extension_check как глобальная переменная, у него будет ссылка на функцию.

Одним из решений является перемещение объявления extension_check выше цикла, другое - использование подъема функции с помощью синтаксиса объявления функции

$scope.uploadFiles = function (files) {
    $scope.files = files;


    angular.forEach(files, function (file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
                url: 'http://172.18.139.3:3000/attachments',
                file: file

            });

            file.upload.then(function (response) {
                $timeout(function () {
                    file.result = response.data;
                    if (file.result.header.status["code"] == "ERROR") {

                        file.$error = true
                        $scope.message = file.result.header.status.message
                        console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                    }

                });
            }, function (response) {
                if (response.status > 0) $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }


        console.log(file)
    });

    function extension_check(name) {

        var extension_allow = ['jpg', 'jpeg', 'bmp', 'png'];
        var ext = name.substr(name.lastIndexOf('.') + 1).toLowerCase();
        console.log(ext);
        var flag = (extension_allow.indexOf(ext) > -1);
        console.log(flag);
        return flag;

    }
}

Вы также можете определить функцию вне uploadFiles поскольку она не зависит от каких-либо переменных закрытия

var extension_check = function extension_check(name) {
    var extension_allow = ['jpg', 'jpeg', 'bmp', 'png'];
    var ext = name.substr(name.lastIndexOf('.') + 1).toLowerCase();
    console.log(ext);
    var flag = (extension_allow.indexOf(ext) > -1);
    console.log(flag);
    return flag;

}

$scope.uploadFiles = function (files) {
    $scope.files = files;

    angular.forEach(files, function (file) {
        if (file && !file.$error && extension_check(file.name)) {
            file.upload = Upload.upload({
                url: 'http://172.18.139.3:3000/attachments',
                file: file

            });

            file.upload.then(function (response) {
                $timeout(function () {
                    file.result = response.data;
                    if (file.result.header.status["code"] == "ERROR") {

                        file.$error = true
                        $scope.message = file.result.header.status.message
                        console.log('file ' + file.name + ' is got error . Message: ' + file.result.header.status.message);
                    }

                });
            }, function (response) {
                if (response.status > 0) $scope.status.message = response.status + ': ' + response.data;
                // $scope.errorMsg = response.status + ': ' + response.data;
            });

            file.upload.progress(function (evt) {
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }


        console.log(file)
    });
}

Также обратите внимание, чтобы переменная была локальной переменной

  • 0
    спасибо, последнее решение работает нормально, просто не понимаю, почему при вызове функции не делается ссылка на.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню