TL; DR :
ไม่ไม่ต้องสมัครสมาชิกด้วยตนเองอย่าใช้พวกเขาในบริการ ใช้พวกเขาตามที่แสดงในเอกสารประกอบเท่านั้นเพื่อส่งเหตุการณ์ในส่วนประกอบ อย่ากำจัดสิ่งที่เป็นนามธรรมของเชิงมุม
ตอบ:
ไม่คุณไม่ควรสมัครด้วยตนเอง
EventEmitterเป็นนามธรรมเชิงมุม 2 และจุดประสงค์เพียงอย่างเดียวของมันคือการปล่อยกิจกรรมในส่วนประกอบ การอ้างอิงความคิดเห็นจาก Rob Wormald
[... ] EventEmitter เป็นแองกูลาร์นามธรรมที่เป็นนามธรรมและควรใช้สำหรับการเปล่งเหตุการณ์ที่กำหนดเองในส่วนประกอบเท่านั้น มิฉะนั้นเพียงแค่ใช้ Rx ราวกับว่ามันเป็นห้องสมุดอื่น ๆ
สิ่งนี้ระบุไว้ชัดเจนในเอกสารของ EventEmitter
ใช้ตามคำสั่งและส่วนประกอบเพื่อปล่อยเหตุการณ์ที่กำหนดเอง
มีอะไรผิดปกติเกี่ยวกับการใช้มัน?
Angular2 จะไม่รับประกันว่า EventEmitter จะยังคงเป็น Observable ต่อไป นั่นหมายความว่าการเปลี่ยนรหัสของเราหากมันเปลี่ยน API เดียวที่เราต้องเข้าถึงคือemit()
วิธีการ เราไม่ควรสมัครสมาชิกด้วย EventEmitter ด้วยตนเอง
ทั้งหมดที่ระบุไว้ข้างต้นมีความชัดเจนมากขึ้นในความคิดเห็นของ Ward Bell นี้(แนะนำให้อ่านบทความและคำตอบสำหรับความคิดเห็นนั้น) ข้อความอ้างอิงสำหรับการอ้างอิง
อย่าพึ่งพา EventEmitter ต่อไปเพื่อให้เป็น Observable!
อย่าวางใจในโอเปอเรเตอร์ที่สังเกตการณ์เหล่านั้นได้ในอนาคต!
เหล่านี้จะถูกเลิกใช้ในไม่ช้าและอาจถูกลบออกก่อนที่จะเผยแพร่
ใช้ EventEmitter สำหรับการผูกเหตุการณ์ระหว่างลูกและองค์ประกอบหลักเท่านั้น อย่าสมัครเป็นสมาชิก อย่าเรียกวิธีการใด ๆ เหล่านั้น โทรเท่านั้นeve.emit()
ความคิดเห็นของเขาสอดคล้องกับความคิดเห็นของ Rob นานมาแล้ว
ดังนั้นวิธีการใช้อย่างถูกต้อง?
เพียงแค่ใช้มันเพื่อส่งเหตุการณ์จากส่วนประกอบของคุณ ลองดูตัวอย่างต่อไปนี้
@Component({
selector : 'child',
template : `
<button (click)="sendNotification()">Notify my parent!</button>
`
})
class Child {
@Output() notifyParent: EventEmitter<any> = new EventEmitter();
sendNotification() {
this.notifyParent.emit('Some value to send to the parent');
}
}
@Component({
selector : 'parent',
template : `
<child (notifyParent)="getNotification($event)"></child>
`
})
class Parent {
getNotification(evt) {
// Do something with the notification (evt) sent by the child!
}
}
วิธีที่จะไม่ใช้มัน?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
หยุดตรงนั้น ... คุณผิดแล้ว ...
หวังว่าตัวอย่างง่ายๆสองตัวอย่างนี้จะอธิบายการใช้งานที่เหมาะสมของ EventEmitter