javascript - Angular 2 - 如何向模板发送异步信息

标签 javascript asynchronous angular

我正在尝试在验证后向模板发送一些图像信息。但我不明白。

进入模板的变量位于回调内,或者位于异步函数内,并且我不知道将此信息发送到模板。

可以帮我解决这个问题吗?我已经尝试了一切。

event.component.ts

import "rxjs/Rx";
import {Component} from '@angular/core';

@Component({
    selector: '<my-image></my-image>',
    templateUrl: './event.component.html',      
})
export class EventComponent {
    files: File[];
    file: any
    imageName: any;
    imageSize: any;
    whithImage = false;

    ngOnInit() {this.files = []}

    onFileSelect(event) {
        this.files = event.dataTransfer ? event.dataTransfer.files : event.target.files;
        this.file = this.files[0];
        this.isImage(this.file, function(res, file){
            if(res==true){
                this.imageName = file.name;
                this.imageSize = file.size;
                this.whithImage = res;
            }
        }) 
    }

    isImage(file, callback) {
        var reader = new FileReader();
        reader.onload = function(event) {
            var contents = reader.result;
            var buf = new Uint8Array(contents);
            if(buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF){
                callback(true, file) //jpg
            }else{callback(false)}
        };
        reader.readAsArrayBuffer(file);
    }

    onChooseClick(event, fileInput) {
        fileInput.value = null;
    }

event.component.html

<span (click)="onChooseClick($event, fileinput)">
    Image<input  #fileinput type="file" (change)="onFileSelect($event)"/>
</button>
<div *ngIf="whithImage">
    <p>{{ imageName }}</p>
    <p>{{ imageSize }}</p>
</div>

最佳答案

首先尝试 @peeskillet 建议的方法 - 即,通过使用 arrow function 来使用正确的 this 上下文。 :

export class EventComponent {
   onFileSelect(event) {
        ...
        this.isImage(this.file, (res, file) => {     // <----
            if(res==true) {
                this.imageName = file.name;
                this.imageSize = file.size;
                this.whithImage = res;
            }
        }); 
    }

如果这不起作用,那么 Angular 不知道如何对异步事件进行猴子修补,因此当事件触发时,Angular 更改检测不会运行(因此您的 View 不会更新以反射(reflect)新组件)属性值)。您需要 manually trigger change detection 。这是一种方法:

import {ChangeDetectorRef} from '@angular/core';     // <-----
export class EventComponent {
   constructor(private cdref:ChangeDetectorRef) {}   // <-----
   onFileSelect(event) {
        ...
        this.isImage(this.file, (res, file) => {     // <----
            if(res==true) {
                this.imageName = file.name;
                this.imageSize = file.size;
                this.whithImage = res;
                this.cdref.detectChanges();          //  <------
            }
        }); 
    }

关于javascript - Angular 2 - 如何向模板发送异步信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801350/

相关文章:

javascript - 如何在鼠标指针的右侧/左侧显示传单弹出窗口?

reactjs - 如何调度等待其他异步操作完成的 redux 操作?

Python 异步调试示例

javascript - 使用 jQuery 获取元素的所有属性

Javascript 将字符串转换为函数名

javascript - 在 Angular 8 模板驱动表单中单击 "clear"按钮时如何清除文本字段?

javascript - 每个 Angular 组件的范围类名称和脚本

Angular 如何编写模板驱动表单的跨字段验证指令

javascript - AngularJS 1.x NgTagsInput 显示消息

java - 如何从异步 Play 操作返回结果