Angular EventEmitter的正确用法是什么?
我读过这样的问题 用户在其服务中使用EventEmitter,但本文建议他 不使用它,而是直接在他的服务中使用可观察的 我也读过这篇文章 解决方案建议将EventEmitter传递给孩子并订阅它Angular EventEmitter的正确用法是什么?,angular,angular2-services,Angular,Angular2 Services,我读过这样的问题 用户在其服务中使用EventEmitter,但本文建议他 不使用它,而是直接在他的服务中使用可观察的 我也读过这篇文章 解决方案建议将EventEmitter传递给孩子并订阅它 我的问题是:我应该还是不应该手动订阅EventEmitter?我应该如何使用它;博士: 不,不要手动订阅,不要在服务中使用它们。如文档中所示,仅用于在组件中发出事件。不要挫败angular的抽象。 回答: 不,您不应该手动订阅它。 是angular2抽象,其唯一目的是在组件中发出事件。引用Rob Wor
我的问题是:我应该还是不应该手动订阅EventEmitter?我应该如何使用它;博士: 不,不要手动订阅,不要在服务中使用它们。如文档中所示,仅用于在组件中发出事件。不要挫败angular的抽象。 回答: 不,您不应该手动订阅它。 是angular2抽象,其唯一目的是在组件中发出事件。引用Rob Wormald的一句话 […]EventEmitter实际上是一个角度抽象,应该只用于在组件中发送自定义事件。否则,只需将Rx当作其他库使用即可 这一点在EventEmitter的文档中非常明确 由指令和组件使用以发出自定义事件 使用它有什么不对? Angular2永远不会保证EventEmitter会继续成为可观察的。因此,这意味着如果代码发生变化,就要重构代码。我们必须访问的唯一API是它的
emit()
方法。我们不应该手动订阅EventEmitter
上述所有内容在本沃德·贝尔(Ward Bell)的文章中更为明确(建议阅读本文,并参考该评论)。引证
不要指望EventEmitter继续是可观察的
不要指望那些可观察到的操作符将来会出现在那里
这些将很快被弃用,并可能在发布之前删除
仅将EventEmitter用于子组件和父组件之间的事件绑定。不要订阅它。不要调用这些方法中的任何一个。仅调用eve.emit()
他的评论与罗布很久以前的评论一致
那么,如何正确使用它呢?
只需使用它即可从组件发出事件。看看下面的例子
@组件({
选择器:'子',
模板:`
通知我的父母!
`
})
班童{
@Output()notifyParent:EventEmitter=neweventemitter();
发送通知(){
this.notifyParent.emit('Some value to send to the parent');
}
}
@组成部分({
选择器:'父',
模板:`
`
})
班级家长{
获取通知(evt){
//对孩子发送的通知(evt)做些什么!
}
}
怎么不用呢?
classmyservice{
@Output()myServiceEvent:EventEmitter=新的EventEmitter();
}
停在那里。。。你已经错了
希望这两个简单的例子能够澄清EventEmitter的正确用法。是的,请继续使用它。
EventEmitter
是最终的Angular Core API中的一个。它是否基于可观察的
是不相关的;如果其文档化的emit
和subscribe
方法适合您的需要,那么继续使用它
如文件中所述:
使用Rx.Observable,但提供一个适配器,使其按照此处的规定工作:
一旦规范的参考实现可用,就切换到它
所以他们想要一个能观察到的类似于的对象,它以某种方式运行,他们实现了它,并将其公开。如果它仅仅是一个不应该使用的内部角度抽象,他们就不会公开它
很多时候,让发射器发送特定类型的事件非常有用。如果这是你的用例,那就去做吧。如果/当他们链接到的规范的参考实现可用时,它应该是一个替代品,就像任何其他polyfill一样
只需确保传递给subscribe()
函数的生成器遵循链接的规范。返回的对象保证有一个unsubscribe
方法,应该调用该方法来释放对生成器的任何引用(这目前是一个示例,但实际上是一个不应该依赖的实现细节)
导出类MyServiceEvent{
消息:字符串;
eventId:编号;
}
导出类MyService{
public onChange:EventEmitter=neweventemitter();
公共doSomething(消息:string){
//做点什么,然后。。。
emit({message:message,eventId:42});
}
}
出口类支原体{
私人认购;
构造函数(私有服务:MyService){
this.\u serviceSubscription=this.service.onChange.subscripte({
下一步:(事件:MyServiceEvent)=>{
log(`Received message#${event.eventId}:${event.message}`);
}
})
}
公共消费(){
//做些事情,然后稍后。。。
这个.cleanup();
}
私人清理(){
此._serviceSubscription.unsubscribe();
}
}
所有措辞强硬的厄运和悲观预测似乎都源于Angular 2预发布版本上单个开发人员的单堆栈溢出评论。当您想要进行跨组件交互时,您需要知道@Input、@Output、EventEmitter和Subjects是什么 如果组件之间的关系是父子关系,反之亦然,我们将@input&@output与事件发射器一起使用 @输出发射一个事件,您需要使用事件发射器发射
如果不是父子关系。。然后你必须使用主题或通过公共服务。没有:否和否:是。 真相在中间 没有理由因为下一个版本的Angular而害怕 从逻辑的角度来看,如果您有一个组件,并且您想通知其他组件发生了什么事情,