EventEmitter 发出数据但不发出事件
EventEmitter emits data but not event
我在特定场景中挣扎。这是我的 Parent 和 Child class 的样子
export class ChildComponent{
.....
@Output select: EventEmiiter<SomeType> = new EventEmmiter();
....
....
methodWhichEmits(){
this.select.emit(objectOf_SomeType);
}
}
export class ParentComponent{
onSelect(emittedObject){
//perform some logic
event.stopPropagation();
}
}
Parent Template
<child (select)="onSelect($event)"></child>
我的理解(刚接触 angular)是事件从 child 发出并在 parent 中捕获
然后在 onSelect parent 方法中对发出的事件(事件绑定)执行逻辑。
但问题是parent方法的参数不是事件而是child传来的SomeType的object。我想在我的 parent 方法中接收一个事件并使用事件 object(类似于 event.target.value)访问从 child 发出的数据,因为我需要事件 object 调用 stopPropagation()。
即使代码工作正常但测试用例失败(在 topPropagation() 上),因为在 parent 的方法中接收到 SomeType 的 object 而不是事件。
EventEmitter 不是 HTML 事件,而是 Subject 的扩展,因此它只会发送具有值
的事件
自定义 Anguar 事件与本地事件不同。它们只是您所注意到的对象,它们不会传播,也无法取消。
如果您可以放弃 SomeType
类型,一种解决方法是在子组件中调用 stopPropagation()
并将 target
作为事件参数发送。尝试以下
子组件
export class ChildComponent implements OnInit {
@Output() select = new EventEmitter();
handleSomething(event) {
event.stopPropagation();
this.methodWhichEmits(event.target);
}
methodWhichEmits(value) {
this.select.emit(value)
}
}
父组件 - 模板
<app-child (select)=onSelect($event)></app-child>
父组件 - 控制器
onSelect(target: any) {
// handle target
}
如果您尝试将 event
作为发射器值直接发送,由于事件冒泡,可能会产生一些不需要的副作用。
我在特定场景中挣扎。这是我的 Parent 和 Child class 的样子
export class ChildComponent{
.....
@Output select: EventEmiiter<SomeType> = new EventEmmiter();
....
....
methodWhichEmits(){
this.select.emit(objectOf_SomeType);
}
}
export class ParentComponent{
onSelect(emittedObject){
//perform some logic
event.stopPropagation();
}
}
Parent Template
<child (select)="onSelect($event)"></child>
我的理解(刚接触 angular)是事件从 child 发出并在 parent 中捕获 然后在 onSelect parent 方法中对发出的事件(事件绑定)执行逻辑。
但问题是parent方法的参数不是事件而是child传来的SomeType的object。我想在我的 parent 方法中接收一个事件并使用事件 object(类似于 event.target.value)访问从 child 发出的数据,因为我需要事件 object 调用 stopPropagation()。
即使代码工作正常但测试用例失败(在 topPropagation() 上),因为在 parent 的方法中接收到 SomeType 的 object 而不是事件。
EventEmitter 不是 HTML 事件,而是 Subject 的扩展,因此它只会发送具有值
的事件自定义 Anguar 事件与本地事件不同。它们只是您所注意到的对象,它们不会传播,也无法取消。
如果您可以放弃 SomeType
类型,一种解决方法是在子组件中调用 stopPropagation()
并将 target
作为事件参数发送。尝试以下
子组件
export class ChildComponent implements OnInit {
@Output() select = new EventEmitter();
handleSomething(event) {
event.stopPropagation();
this.methodWhichEmits(event.target);
}
methodWhichEmits(value) {
this.select.emit(value)
}
}
父组件 - 模板
<app-child (select)=onSelect($event)></app-child>
父组件 - 控制器
onSelect(target: any) {
// handle target
}
如果您尝试将 event
作为发射器值直接发送,由于事件冒泡,可能会产生一些不需要的副作用。