javascript - 每次更改输入后如何不创建流?
问题描述
我有以下代码:
public upload(): void {
const fileinput = document.getElementById('file');
fileinput.click();
fileinput.addEventListener('change', this.handleFileInput.bind(this));
}
private handleFileInput(event) {
try {
const input = event.target as HTMLInputElement;
const reader = new FileReader();
const { objectId } = this.object;
const file = input.files[0];
reader.onload = () => {
event.target.value = null;
this.objectDetailsService
.upload(file, objectId)
.subscribe(
() => //,
() => //,
);
};
reader.readAsArrayBuffer(file);
} catch (e) {
console.log(e);
}
}
我有时应该允许加载相同的文件。当用户选择另一个此代码创建为新流。如何避免?
解决方案
你问如何申请是对的switchMap
。一种方法是创建一个 observable 来处理异步回调onload
。然后您可以应用运算符,例如switchMap
调用其他异步函数。
另外我建议直接在模板中附加事件处理程序,而不是document.getElementById('file');
在控制器中使用。
尝试以下
* .ts
import { Observable, Observer, timer } from 'rxjs';
import { switchMap } from 'rxjs/operators';
public handleFileInput(event) {
const input = event.target as HTMLInputElement;
const file = input.files[0];
this.readFile(file).pipe(
switchMap((file: any) => {
const { objectId } = this.object;
return this.objectDetailsService.upload(file, objectId);
})
).subscribe({
next: () => console.log('File uploaded'),
error: (error: any) => console.log('Error:', error),
});
}
readFile(file): Observable<any> {
const reader = new FileReader();
reader.readAsArrayBuffer(file);
return new Observable((observer: Observer<any>) => {
reader.onload = (ev: ProgressEvent) => {
observer.next(file);
observer.complete();
};
reader.onerror = (error: any) => {
observer.error(error);
};
});
}
* .html
Select file: <input type="file" (change)="handleFileInput($event)" />
工作示例:Stackblitz
推荐阅读
- c++ - 无法在树莓派 4 上打开网络摄像头视频
- javascript - 如何在 JavaScript 中正确添加这两个模拟的通用寄存器?
- java - 如何在firebase中插入数据字符串数组?
- react-native - 谷歌播放控制台封闭式测试链接发送给接受的测试人员,以无限时间加载应用程序。(反应原生)
- flutter - 颤振飞镖泛型类型比较无法正常工作
- .net - 有什么方法可以让 .NET 热重载更快?
- c# - 如何在运行 SQL Server 的虚拟机上创建 connectionString 以将 ado.net c# 连接到
- css - Highcharts如何为饼图数据和向下钻取数据制作一组颜色
- c# - 获取所有 cookie,包括 httponly - WebView UI
- javascript - 禁用按钮后,仅将底部边框设置为宽度为 0