Angular service/factory - свойство класса не обновляется при передаче файла cordova

У меня есть служба Angular, которая выполняет загрузку Cordova File Transfer в мобильном приложении - она ​​загружает файл на медиа-сервер и возвращает объект. Я пытаюсь передать этот объект media_response собственность, но мне не повезло - что я делаю не так?

Пожалуйста, обратите внимание - я пытался использовать service а также factory и до сих пор, кажется, не получить радости - что-нибудь в $cordovaFileTransfer upload блок не передается в свойства класса по какой-то странной причине.

Я ожидаю увидеть media_response с тем же выводом, что и переменная данных, которая является объектом, возвращаемым с медиа-сервера, но она говорит no response

Есть идеи, почему я не получаю ожидаемого ответа?

// Ожидаемый ответ

UploadService.media_response in the controller should be an object to match the console.log(data)

// Актуальный ответ

UploadService.media_response is the string 'no response'

// Загрузить сервис

abcdServices.service('UploadService', function($http, $localStorage, $location, $q, $rootScope, $cordovaFileTransfer) {

var UploadService = function() {
    this.upload_in_progress = false;
    this.progress = 0;
    this.media_response = '';
};

UploadService.prototype.cordovaFileUpload = function (filename, url, targetPath) {
    this.upload_in_progress = true;
    this.media_response = 'no response';

    var options = {
        id: new Date() . getTime()  + filename,
        fileKey: "file",
        fileName: filename,
        chunkedMode: false,
        mimeType: "multipart/form-data",
        params : {'fileName': filename}
    };

    $cordovaFileTransfer.upload(url, targetPath, options).then(
        function(result) {
            // Success!
            var data = JSON.parse(result.response);
            console.log('file uploaded - response:', data); // ALWAYS A OBJECT
            this.media_response = 'fake response2';
            UploadService.media_response = 'fake response3';

            if (angular.isDefined(data.id)) {
                angular.forEach(data, function(value, key) {
                    // image[key] = value;
                });
                // $scope.post.linkThumbnail = false;
                // $scope.post.video = '';
            } else if (angular.isDefined(data.message)) {
                // $scope.uploadError = data.message;

            } else {

            }
        }, function(err) {

        }, function (progress) {
            // constant progress updates
            this.progress = parseInt(100 * progress.loaded / progress.total) + '%';
        }
    );

};

return new UploadService();});

// контроллер

UploadService.cordovaFileUpload(filename, url, targetPath, options);
console.log(UploadService); // to view in js console

1 ответ

Решение

Ваш this. переменные находятся в ближайшем функциональном блоке, а не в сервисе / фабрике.

Создайте переменные в корне вашей службы / фабрики с помощью var или же let,


abcdServices.service('UploadService', function($http, $localStorage, $location, $q, $rootScope, $cordovaFileTransfer) {

    let upload_in_progress = false;
    let progress = 0;
    let media_response = '';

    var UploadService = function() {
        upload_in_progress = false;
        progress = 0;
        media_response = '';
    };

    UploadService.prototype.cordovaFileUpload = function (filename, url, targetPath) {
        upload_in_progress = true;
        media_response = 'no response';

        // Rest of your code
    };

return new UploadService();});

Если вам действительно нужно / хотите использовать this, используйте новую функцию стрелки обозначения, которая не создает новую this-обзор в функциональном блоке.

abcdServices.service('UploadService', function(...) {

    this.upload_in_progress = 'test';
    this.progress = 0;
    this.media_response = '';

    someFunction = (param1, param2, ..) => {
        console.log(this.upload_in_progress) // 'test'
    }

});
Другие вопросы по тегам