javascript - ng-repeat 内的 AngularJS 图像预览,可能是范围问题

标签 javascript angularjs angularjs-directive angularjs-scope preview

我找到了this question并对其进行了一些更改,只要我在 ng-repeat 之外使用它,它似乎就可以正常工作。

但是由于某种原因我无法让它在我的重复中工作,image.src从未更新。我想这更多的是范围问题,而不是实际的预览功能。我可以看到 plunk 第 13 行中的 console.log(attr.imageData); 在控制台中显示了一个字符串 image。我认为这应该是循环中的对象。

选择文件后如何获取预览图像?

<强> Plunker link.

HTML:

<div ng-repeat="image in data.CmsPageImages">
    <a href="" ng-click="removeImage($index)" class="pull-right">
        <i class="fa fa-times"></i>
    </a>
    <input
        image-callback="test1"
        type="file"
        wa-file-select
        ng-model="image.file">
    <input
        type="text"
        required
        placeholder="Caption and copyright"
        ng-model="image.caption">
    <img ng-if="image.src" ng-src="image.src" style="width: 120px; height: auto;" />
</div>

整个JS代码:

angular.module('waFrontend', []);

angular.module('waFrontend').directive('waFileSelect', ['fileReader', function (fileReader) {
    return {
      require: '^ngModel',
      scope: {
        imageData: '='
      },
        link: function ($scope, el, attr) {
            el.bind('change', function(e) {
              var file = ((e.srcElement || e.target).files[0]);
          fileReader.readAsDataUrl(file, $scope).then(function (result) {
                attr.imageData.src = result;
            });
            })
        }
    }
}]);

angular.module('waFrontend').controller('SubmitNewsController', [
    '$scope', 'fileReader',
    function ($scope, fileReader) {

    $scope.data = {
        CmsPage: {
            title: ''
        },
        CmsPageImages: [
            {
                caption: '',
                file: null
            }
        ]
    };

    $scope.addImage = function() {
        $scope.data.CmsPageImages.push({
            caption: null,
            file: null
        });
    };

    $scope.removeImage = function(index) {
        $scope.data.CmsPageImages.splice(index, 1);
    };

    $scope.getFile = function(file, test) {
        $scope.progress = 0;
        $scope.file = file;
        fileReader.readAsDataUrl($scope.file, $scope).then(function (result) {
            $scope.imageSrc = result;
        });
    };

}]);

(function (module) {

    var fileReader = function ($q, $log) {

        var onLoad = function (reader, deferred, scope) {
            return function () {
                scope.$apply(function () {
                    deferred.resolve(reader.result);
                });
            };
        };

        var onError = function (reader, deferred, scope) {
            return function () {
                scope.$apply(function () {
                    deferred.reject(reader.result);
                });
            };
        };

        var onProgress = function (reader, scope) {
            return function (event) {
                scope.$broadcast("fileProgress",
                        {
                            total: event.total,
                            loaded: event.loaded
                        });
            };
        };

        var getReader = function (deferred, scope) {
            var reader = new FileReader();
            reader.onload = onLoad(reader, deferred, scope);
            reader.onerror = onError(reader, deferred, scope);
            reader.onprogress = onProgress(reader, scope);
            return reader;
        };

        var readAsDataURL = function (file, scope) {
            console.log(file);
            var deferred = $q.defer();

            var reader = getReader(deferred, scope);
            console.log(file);
            reader.readAsDataURL(file);

            return deferred.promise;
        };

        return {
            readAsDataUrl: readAsDataURL
        };
    };

    module.factory("fileReader", ["$q", "$log", fileReader]);

}(angular.module("waFrontend")));

最佳答案

console.log(attr.imageData) 将仅显示您放入其中的 attr 字符串,要准确查看应使用 $scope.$eval( attr.imageData)

您还忘记将 imageData 参数添加到指令中:

<input
    image-callback="test1"
    image-data="image"
    type="file"
    wa-file-select
    ng-model="image.file">

或者从指令范围初始化中删除它,因为它可能会导致错误。

attr.imageData.src = result; - 这是行不通的。请改用 $scope.imageData.src = result

看来您的指令中不需要 ng-model="image.file" 并且 require: '^ngModel' 也应该删除,但如果您有进一步的需求,请保留它。

关于javascript - ng-repeat 内的 AngularJS 图像预览,可能是范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30218935/

相关文章:

angularjs - 让内部指令在外部指令之前运行

javascript - 使用 parseInt 获取 div 元素属性总是返回 NAN

javascript - Javascript 问题(异步调用)

javascript - 如何使用 Protractor 在警告框中单击“确定”

angularjs - 如何在 ng-repeat 中分隔组

javascript - 按Tab键时如何打开选择框?

css - ng-class 和 ng-style 有什么区别?

javascript - Angular JS 中的动态 View 是什么?

javascript - 在 Javascript 中使用 JSP 值

angularjs - SEO 和多语言支持