Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular EventEmitter的正确用法是什么?_Angular_Angular2 Services - Fatal编程技术网

Angular EventEmitter的正确用法是什么?

Angular EventEmitter的正确用法是什么?,angular,angular2-services,Angular,Angular2 Services,我读过这样的问题 用户在其服务中使用EventEmitter,但本文建议他 不使用它,而是直接在他的服务中使用可观察的 我也读过这篇文章 解决方案建议将EventEmitter传递给孩子并订阅它 我的问题是:我应该还是不应该手动订阅EventEmitter?我应该如何使用它;博士: 不,不要手动订阅,不要在服务中使用它们。如文档中所示,仅用于在组件中发出事件。不要挫败angular的抽象。 回答: 不,您不应该手动订阅它。 是angular2抽象,其唯一目的是在组件中发出事件。引用Rob Wor

我读过这样的问题 用户在其服务中使用EventEmitter,但本文建议他 不使用它,而是直接在他的服务中使用可观察的

我也读过这篇文章 解决方案建议将EventEmitter传递给孩子并订阅它


我的问题是:我应该还是不应该手动订阅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而害怕

从逻辑的角度来看,如果您有一个组件,并且您想通知其他组件发生了什么事情,