【问题标题】:How to integrate a progress bar into angularjs directive with file upload如何通过文件上传将进度条集成到 angularjs 指令中
【发布时间】:2013-07-24 18:03:29
【问题描述】:

我需要为文件上传创建一个进度条。我知道我的进度事件监听器正在工作。是否有更多“角度方式”可以做到这一点?如何从事件侦听器中更新进度条?

作为序言,如果一般逻辑流程也需要帮助,请随时纠正和批评。

我有这个画布...

<canvas id="progress"></canvas>

我有一个上传文件的 angularjs 指令。我添加了一个进度事件监听器(只显示相关部分)...

link: function postLink(scope, element, attrs, ctrl) {
    var fileUpload = function (img, file) {
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener("progress", function(e) {
            if (e.lengthComputable) {
                var percentage = Math.round((e.loaded * 100) / e.total);
                // UPDATE THE PROGRESS BAR HERE
            }
        }, false);
    }
    element.bind('change', function (evt) {
         var files = evt.target.files;
         var canvas = document.getElementById("progress"),
         context = canvas.getContext("2d");
         context.fillStyle = 'lighgray';
         context.fillRect(0, 0, 200, 18);
         context.moveTo(0, 0);
         context.fillStyle = 'darkgray';
         context.fillRect(0, 0, 1, 18);
         for(var i = 0; i < files.length; i++) {
             fileUpload(files, files[i]);
        }
    }
}

【问题讨论】:

    标签: html angularjs html5-canvas


    【解决方案1】:

    看看 Angular UI Bootstrap:http://angular-ui.github.io/bootstrap/

    它为包括进度条在内的 Bootstrap UI 元素提供指令。

    看起来你只需要将上传进度值与栏绑定,它会自动更新。

    (一定喜欢双向数据绑定。)

    【讨论】:

    • 那么假设我从 UI Bootstrap 中包含了相关的 javascript,代码会是什么样子? 是 html...
    • 使用scope.percentage 代替var percentage 并与percent={{percentage}} 绑定。
    【解决方案2】:

    看看HTML5 progress tag,你的代码会是这样的

        if (e.lengthComputable) {
            var percentage = Math.round((e.loaded * 100) / e.total);
            $('progress').val(percentage);
        }
    

    我知道它有很多兼容性问题,并且在不同的浏览器中看起来不同(尽管您可以使用 css3 修复它:nice example

    在你的情况下,你应该一次又一次地填充矩形

    if (e.lengthComputable) {
        var percentage = e.loaded / e.total;
        context.fillRect(0, 0, progressWidth*percentage, 18);
    }
    

    我去掉了*100%,因为你最好在创建上下文时使用var progressWidth = 200

    this example,它更好地表达了我的意思(对不起我的英语)

    【讨论】:

    • 查看我对问题的编辑。我绘制进度条的代码实际上在 onchange 处理程序中,这使得 var 上下文在我的上传函数中不可用。您将如何使其可用?
    • @drewschmaltz 只是将context 置于fileUpload 函数之上
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2010-11-01
    • 1970-01-01
    • 2018-01-06
    • 2011-02-12
    相关资源
    最近更新 更多