Html 子组件向父组件发出的事件的奇怪行为
我正在使用EventEmitter从子组件向父组件发送URLMeages数组 儿童发射器:Html 子组件向父组件发出的事件的奇怪行为,html,arrays,angular,typescript,events,Html,Arrays,Angular,Typescript,Events,我正在使用EventEmitter从子组件向父组件发送URLMeages数组 儿童发射器: @Output() images = new EventEmitter<string[]>(); 控制台输出: 为什么images[0]会给出未定义的当我在控制台输出中看到它有数据时,我如何访问images:string[]数据 编辑: @Output() images = new EventEmitter<string[]>(); @科尔比·亨特(Colby Hunte
@Output() images = new EventEmitter<string[]>();
控制台输出:
为什么images[0]
会给出未定义的当我在控制台输出中看到它有数据时,我如何访问images:string[]
数据
编辑:
@Output() images = new EventEmitter<string[]>();
@科尔比·亨特(Colby Hunter)作为对评论的回答,以下是《儿童》的内容:
@组件({
选择器:“应用程序文件上载”,
templateUrl:“./file upload.component.html”,
样式URL:['./文件upload.component.css']
})
导出类FileUploadComponent实现OnInit{
LoadeImage URL=[];
@Output()images=neweventemitter();
构造函数(){
}
恩戈尼尼特(){
}
选举(事件){
const filesList=event.target.files;
for(文件列表的常量文件){
const reader=new FileReader();
reader.onload=(e:any)=>{
this.loadedImagesUrl.push(e.target.result);
};
reader.readAsDataURL(文件);
}
this.images.emit(this.loadedImagesAsURL);
}
}
维比尔兹·兹德希亚
浏览器的控制台执行惰性评估。试着做:
console.log(JSON.stringify(images));
console.log(images[0]);
您将看到它是一个空数组
在您的情况下,当您手动单击控制台日志“images”时,文件将被加载,您将看到内容
因为您需要读取所有文件并进行最终发射,所以将所有文件读取事件作为可观察事件,
完成所有观测值后发射阵列
public onFileSelected(event): void {
let loadenedObs = this._createFileReaderObs(event);
forkJoin(...loadenedObs).subscribe(() => {
// all the files are read, emit the array now.
this.images.emit(this.loadedImagesAsURL);
})
}
private _createFileReaderObs(event): [] {
let obsArr = [];
const filesList = event.target.files;
for (const file of filesList) {
const reader = new FileReader();
const loadenedEventObs = fromEvent(reader, 'loadend').pipe(
tap(() => {
this.loadedImagesAsURL.push(reader.result);
}),
take(1) // take one event to complete the Observable
);
obsArr.push(loadenedEventObs); // create an array of loadened observables.
reader.readAsDataURL(file);
}
return obsArr;
}
浏览器的控制台执行延迟计算。试着做:
console.log(JSON.stringify(images));
console.log(images[0]);
您将看到它是一个空数组
在您的情况下,当您手动单击控制台日志“images”时,文件将被加载,您将看到内容
因为您需要读取所有文件并进行最终发射,所以将所有文件读取事件作为可观察事件,
完成所有观测值后发射阵列
public onFileSelected(event): void {
let loadenedObs = this._createFileReaderObs(event);
forkJoin(...loadenedObs).subscribe(() => {
// all the files are read, emit the array now.
this.images.emit(this.loadedImagesAsURL);
})
}
private _createFileReaderObs(event): [] {
let obsArr = [];
const filesList = event.target.files;
for (const file of filesList) {
const reader = new FileReader();
const loadenedEventObs = fromEvent(reader, 'loadend').pipe(
tap(() => {
this.loadedImagesAsURL.push(reader.result);
}),
take(1) // take one event to complete the Observable
);
obsArr.push(loadenedEventObs); // create an array of loadened observables.
reader.readAsDataURL(file);
}
return obsArr;
}
就ts和HTML文件而言,您的子组件是什么样子的?就ts和HTML文件而言,您的子组件是什么样子的?@IngoBürk:对,我没有看到。谢谢更新了答案。谢谢你的帮助!但我对forkJoin部分有点困惑,因为当我插入console.log('foobar');在subscribe()中发出之前,它不会被记录。我应该添加一些东西来启动吗?\u createFileReaderObs()为我上传的每个图像返回一个观察值数组,但感觉obsArr中的这些观察值永远不会完成。是我遗漏了什么还是forkJoin从未执行的原因?@hdw3:是的,请检查编辑,我添加了一个take()
操作符,一旦发生一个loadend
事件,这将完成每个观察。@IngoBürk:是的,我遗漏了那个。谢谢更新了答案。谢谢你的帮助!但我对forkJoin部分有点困惑,因为当我插入console.log('foobar');在subscribe()中发出之前,它不会被记录。我应该添加一些东西来启动吗?\u createFileReaderObs()为我上传的每个图像返回一个观察值数组,但感觉obsArr中的这些观察值永远不会完成。是我遗漏了什么还是forkJoin从未执行的原因?@hdw3:好的,请检查编辑,我添加了一个take()
操作符,一旦发生一个loadend
事件,这将完成每个观察。