我正在尝试为我的5角网站创建一个图像上传工具。它使用ngx pica来调整图像客户端的大小,但是在调用resize服务时,我遇到了ui冻结的问题,我需要一些关于如何阻止它冻结的想法。
图像大小为:(所有同时添加)
2.6兆
170万
346万
我不明白是什么原因造成的冻结,任何帮助都将不胜感激。
我试过的东西
我试着删除changeDetectorRef.detectChanges()只是想看看它是否能阻止用户界面冻结,它没有
添加图像而不调整其大小将停止冻结问题(删除对this._ngxPicaService.resizeImage的调用)
我试过检查源代码,但找不到任何明显的东西
我提供了调整大小的功能,所以我不必限制图像大小的用户上传,但显然冻结的UI也不能接受。

import { Component, ViewEncapsulation, ChangeDetectorRef } from '@angular/core';

import { NgxPicaService, NgxPicaErrorInterface, NgxPicaResizeOptionsInterface, NgxPicaImageService } from 'ngx-pica';
import { AspectRatioOptions } from 'ngx-pica/src/ngx-pica-resize-options.interface';

@Component({
  selector: 'az-multiple-image-uploader',
  encapsulation: ViewEncapsulation.None,
  templateUrl: './multiple-image-uploader.component.html',
  styleUrls: ['./multiple-image-uploader.component.scss']
})
export class MultipleImageUploaderComponent {
    public images: File[] = [];

    constructor(
        private _changeDetectorRef: ChangeDetectorRef,
        private _ngxPicaService: NgxPicaService,
        private _ngxPicaImageService: NgxPicaImageService
    ) { }

    fileChange(input){
        this.handleFiles(input.files);
    }

    private addLoadingAnimations(numberToAdd: number): void {
        var spinner = require("assets/img/Spinner.svg");

        for(var i =0; i < numberToAdd; i++)
        {
            this.images.push(spinner);
        }
    }

    public handleFiles(files: any) {
        var listLength = this.images.length;
        this.addLoadingAnimations(files.length);

        var width = 1024;
        var height = 683;

        for(var index = 0; index < files.length; index++){
            this._ngxPicaService.resizeImage(files[index], width, height, new ImageResizeOptions())
                .subscribe((imageResized: File) => {
                    let reader: FileReader = new FileReader();

                    reader.addEventListener('load', (event: any) => {
                        this.images.splice(listLength, 1);
                        this.images[listLength] = event.target.result;
                        listLength += 1;
                        this._changeDetectorRef.detectChanges();
                    }, false);

                    reader.readAsDataURL(imageResized);

            }, (err: NgxPicaErrorInterface) => {
                throw err.err;
            });
        }
    }

    removeImage(index):void{
        this.images.splice(index, 1);
    }
}

export class ImageResizeOptions implements NgxPicaResizeOptionsInterface
{
  aspectRatio = new ImageAspectRatioOptions(true);
}

export class ImageAspectRatioOptions implements AspectRatioOptions {
  keepAspectRatio: boolean;
  forceMinDimensions?: boolean;

  constructor(keepAspectRatio: boolean, forceMinDimensions?: boolean) {
    this.keepAspectRatio = keepAspectRatio;
    this.forceMinDimensions = forceMinDimensions;
  }
}


<div class="col-8 mx-auto">
    <input type="file" multiple (change)="fileChange(input)" #input class="m-img-upload-btn"/>
    <button class="btn btn-success btn-block" type="button">
        <i class="fa fa-upload"></i> Images...
    </button>
</div>

<div class="card images-container">
    <div *ngFor="let image of images; let i=index;" class="m-image-wrapper">
        <i class="fa fa-times m-delete-img" (click)="removeImage(i)"></i>
        <img [src]="image">
    </div>
</div>

最佳答案

阻止ui冻结的答案是web工作者。
我尝试的任务需要很长时间,任何长时间运行的计算都会导致ui冻结。
在angular中有一个很好的称为https://www.npmjs.com/package/angular2-web-worker的小包,它将帮助您实现web工作者

08-19 08:22