使用 FormControl 订阅输入类型文件更改?

Subscribing to input type file changes with FormControl?

当我订阅由在 input 上选择文件触发的 FormControl.valueChanges() 时,发出的值不包含所选文件的完整路径。是否可以通过订阅获取此信息,或者我们是否必须直接使用 @ViewChild 将其从元素中提取出来才能直接访问元素?设置如下所示:

<input #file name='file' id='file' type='file' [formControl]='loadButton'/>

订阅是这样的:

this.loadButton.valueChanges
    .pipe(untilDestroyed(this))
    .subscribe(path => {
      console.dir(path);
    });
}

选择文件后,记录的语句如下所示:

C:\fakepath\test.png

在我的项目中,我是在一个组件中完成的,例如:

import { Component, EventEmitter, Output } from '@angular/core';
@Component({
  selector: 'app-image-uploader',
  template: '<input type="file" (change)="onUploadFileChanged($event)" />',
})
export class ImageUploaderComponent implements OnInit {
    @Output() uploadStatusChange = new EventEmitter<any>();
    onUploadFileChanged(event) {
        this.targetElement = event.target;
        if (event.target.files && event.target.files[0]) {
            component.uploadStatusChange.emit('ready');
        }
    }

}

现在,选择文件后,组件会告诉父组件我已经准备好了,然后你可以设置 fromControl patch 为 true。父组件的 HTML 例如,对于上面的例子,$event 等于字符串 'ready':

<app-image-uploader (uploadStatusChange)="yourFunction($event)"></app-image-uploader>

对于图片,您也可以在上传前使用FileReader显示它。