在本文的帮助下,我使用包括@Input
和@Output
的angular元素创建了一个小型web组件。
我可以将数据传递到@Input
属性,但听@Output
事件会让我抓狂,因为我不知道如何从回调事件参数中读取数据。
//Emitting the boolean data
likeEvent() {
this.likeNotify.emit(true);
}
在纯javascript中,我听到了类似Notify的事件,如下所示:
const el = document.querySelector('facebook-card');
el.addEventListener('likeNotify', e => {
console.log(e.currentTarget.data); // Not working
});
那么,我如何从发射器传递的对象中检索true/false值呢?
通过web组件中的Output传输的数据可以从event.detail
属性读取:
const el = document.querySelector('facebook-card');
el.addEventListener('likeNotify', (event) => console.log(event.detail));
有关更多详细信息,您可以在这里阅读
组件输出作为HTML自定义事件调度,自定义事件的名称与输出名称匹配。例如,对于具有
@Output() valueChanged = new EventEmitter()
的组件,相应的自定义元素将调度名称为"valueChanged"的事件,并且发出的数据将存储在事件的detail属性中。如果提供了别名,则使用该值;例如,@Output('myClick') clicks = new EventEmitter<string>();
会导致名称为"myClick"的调度事件。
我最近使用Angular 11构建了一个带有Angular Elements的小型web组件。我无法使用event.detail从我的事件中获取数据,我发现数据似乎在event.originalEvent.detail上。所以它可能类似于:el.addEventListener('likeNotify', (event) => console.log(event.originalEvent.detail));
如果您得到"无法读取未定义(读取"emit"("的属性;就像我的情况一样。接下来的几行可能会有所帮助。
if(this.itemSelectedEvent) this.itemSelectedEvent.emit(selectedItem);
else{
let thisHtml = ((this as any) as HTMLElement);
if(thisHtml?.dispatchEvent) thisHtml.dispatchEvent(new CustomEvent('onItemSelected', { detail: {selectedItem} }));
}