我在CustomHttp中读过类似访问EventEmitter Service的问题 用户在他的服务中使用EventEmitter,但他在这个评论中被建议 不使用它,而是直接在他的服务中使用Observables。
我也读过这个 问题 解决方案建议将EventEmitter传递给子进程并订阅它。
我的问题是:我是否应该手动订阅EventEmitter?我该如何使用它?
我在CustomHttp中读过类似访问EventEmitter Service的问题 用户在他的服务中使用EventEmitter,但他在这个评论中被建议 不使用它,而是直接在他的服务中使用Observables。
我也读过这个 问题 解决方案建议将EventEmitter传递给子进程并订阅它。
我的问题是:我是否应该手动订阅EventEmitter?我该如何使用它?
当前回答
当你想进行跨组件交互时,你需要知道什么是@Input, @Output, EventEmitter和Subjects。
如果组件之间的关系是父子关系,反之亦然,我们使用@input & @output与事件发射器。
@output会触发一个事件,你需要使用事件发射器来触发。
如果不是亲子关系…然后你必须使用主题或通过公共服务。
其他回答
没有:nono和no: yes - yes。 真相在中间 也没有理由因为Angular的下一个版本而害怕。
From a logical point of view, if You have a Component and You want to inform other components that something happens, an event should be fired and this can be done in whatever way You (developer) think it should be done. I don't see the reason why to not use it and i don't see the reason why to use it at all costs. Also the EventEmitter name suggests to me an event happening. I usually use it for important events happening in the Component. I create the Service but create the Service file inside the Component Folder. So my Service file becomes a sort of Event Manager or an Event Interface, so I can figure out at glance to which event I can subscribe on the current component.
我知道,也许我是一个老式的开发者。 但这不是事件驱动开发模式的一部分,这是您特定项目的软件架构决策的一部分。
有些人可能认为直接使用observable很酷。在这种情况下,直接使用可观察对象。 你不是连环杀手干的。除非你是一个精神变态的开发者,到目前为止,这个程序是有效的,去做吧。
当你想要组件交互时,你需要知道什么是@Input, @Output, EventEmitter和Subjects。
如果组件之间的关系是父子关系,反之亦然,我们使用@input & @output与事件发射器。
@output会触发一个事件,你需要使用事件发射器来触发。
如果不是亲子关系…然后你必须使用主题或通过公共服务
从纯实现的角度来看,因为emit和subscribe是EventEmitter公共接口的一部分,所以可以将它们用于实现。
对于angular来说,如果它不想要的话,没有强制从行为中继承,行为可以是EventEmitter类中的私有成员,比如,
public class EventEmitter{
private _behaviour=new Subject<void>();
private _behaviour$=this._behaviour.asObservable();
......
public emit(){
_behaviour.emit();
}
....
}
如果它继承了行为,但行为不像行为,则违反了利斯科夫替换原理。
当你想进行跨组件交互时,你需要知道什么是@Input, @Output, EventEmitter和Subjects。
如果组件之间的关系是父子关系,反之亦然,我们使用@input & @output与事件发射器。
@output会触发一个事件,你需要使用事件发射器来触发。
如果不是亲子关系…然后你必须使用主题或通过公共服务。
是的,尽管用吧。
EventEmitter是一个在最终的Angular核心API中文档化的公共类型。它是否基于可观察对象无关紧要;如果它记录的emit和subscribe方法适合您的需要,那么就使用它。
正如文件中所述:
使用的处方。可观察对象,但提供了一个适配器,使其按此处指定的方式工作:https://github.com/jhusain/observable-spec 一旦该规范的参考实现可用,就切换到它。
所以他们想要一个类似于Observable的对象,以某种方式表现,他们实现了它,并将其公开。如果它只是一个不应该被使用的Angular内部抽象,他们就不会公开它。
在很多情况下,使用发送特定类型事件的发射器是很有用的。如果这是你的用例,那就去做吧。如果/当他们链接到的规范的参考实现可用时,它应该是一个附带的替代品,就像任何其他填充材料一样。
只要确保传递给subscribe()函数的生成器遵循链接规范。返回的对象保证有一个unsubscribe方法,应该调用该方法来释放对生成器的任何引用(这目前是一个RxJs订阅对象,但这确实是一个不应该依赖的实现细节)。
export class MyServiceEvent {
message: string;
eventId: number;
}
export class MyService {
public onChange: EventEmitter<MyServiceEvent> = new EventEmitter<MyServiceEvent>();
public doSomething(message: string) {
// do something, then...
this.onChange.emit({message: message, eventId: 42});
}
}
export class MyConsumer {
private _serviceSubscription;
constructor(private service: MyService) {
this._serviceSubscription = this.service.onChange.subscribe({
next: (event: MyServiceEvent) => {
console.log(`Received message #${event.eventId}: ${event.message}`);
}
})
}
public consume() {
// do some stuff, then later...
this.cleanup();
}
private cleanup() {
this._serviceSubscription.unsubscribe();
}
}
所有这些措辞强硬的悲观预测似乎都来自于一个开发者在Angular 2预发布版上的一条Stack Overflow评论。