我构建 ionic2 应用程序 - 基于 angular 2。在我的应用程序中,我使用Cropper.js库让用户编辑他加载的图像。
现在我有一个问题。当用户加载新图片时,我将其显示在主容器中并打开此图像的裁剪框。
但是裁剪框显示了容器中的前一个图像。
唯一对我有用的解决方案是通过 setTimeout 打开作物,但正如我们所知,这不是一个好的解决方案。
还有什么想法吗?
这是我的代码:
HTML - 容器元素:
<div class="selected-image">
<img *ngIf="currentImage.src != null" #selectedPhoto [src]="currentImage.src"/>
</div>
现在,在用户单击按钮从相机添加图片(通过cordova插件)后,我得到了图片url,我将图片推送到图片数组,然后设置currentImage变量来保存新图片。
这是我的typeScript 代码,它也有 viewChild 来保存容器。注意 setTimeout 块,现在它可以工作了,但是如果我从 setTimeout 包装器中解包代码 - 它会打开带有上一张图片的裁剪框。
我还尝试将其更改为 NgZone.run 包装器,但没有帮助。
export class myClass {
@ViewChild('selectedPhoto') input: ElementRef;
pictures: PictureData[] = new Array();
mainImage: PictureData = new PictureData();
private cropper: Cropper;
constructor(public _zone: NgZone) {}
function addPicture(){
var self = this;
Camera.getPicture({
destinationType: Camera.DestinationType.DATA_URL,
sourceType: Camera.PictureSourceType.CAMERA,
quality: 95,
targetHeight: 400,
targetWidth:400
}).then((imageURI) => {
var picture = {src:imageURI};
self._zone.run(() => {
self.pictures.push(picture);
self.currentImage = picture;
setTimeout(() => {
if (this.cropper && this.cropper['canvas']) {
this.cropper.destroy();
}
if (!this.cropper || !this.cropper['canvas']) {
this.cropper = new Cropper(this.input.nativeElement, {
aspectRatio: 1 / 1,
dragMode: 'crop',
modal: true,
guides: false,
center: true,
highlight: false,
background: false,
autoCrop: true,
autoCropArea: 0.9,
responsive: true,
checkCrossOrigin: false,
crop: (e: Cropper.CropperCustomEvent) => {
}
});
}
}, 2000);
});
});
}
}
PS 如果您是拥有超过 1500 名声望的用户,请考虑为“cropper.js”创建新标签。