Renderer เลิกใช้แล้วใน Angular 4.0.0-rc.1 อ่านการอัปเดตด้านล่าง
วิธี angular2คือการใช้งานlisten
หรือlistenGlobal
จากการแสดงผล
ตัวอย่างเช่นหากคุณต้องการเพิ่มเหตุการณ์การคลิกไปยังคอมโพเนนต์คุณต้องใช้ Renderer และ ElementRef (สิ่งนี้จะช่วยให้คุณมีตัวเลือกในการใช้ ViewChild หรือสิ่งใด ๆ ที่ดึงข้อมูลnativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
คุณสามารถใช้listenGlobal
ที่จะให้คุณเข้าถึงdocument
, body
ฯลฯ
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
โปรดทราบว่าตั้งแต่ beta.2 ทั้งคู่listen
และlistenGlobal
ส่งคืนฟังก์ชันเพื่อลบผู้ฟัง (ดูที่การแบ่งการเปลี่ยนแปลงจาก changelog สำหรับ beta.2) นี่คือการหลีกเลี่ยงการรั่วไหลของหน่วยความจำในแอปพลิเคชันขนาดใหญ่ (ดู# 6686 )
ดังนั้นในการลบผู้ฟังที่เราเพิ่มแบบไดนามิกเราต้องกำหนดlisten
หรือlistenGlobal
ให้กับตัวแปรที่จะเก็บฟังก์ชั่นกลับมาแล้วเราดำเนินการมัน
// listenFunc will hold the function returned by "renderer.listen"
listenFunc: Function;
// globalListenFunc will hold the function returned by "renderer.listenGlobal"
globalListenFunc: Function;
constructor(elementRef: ElementRef, renderer: Renderer) {
// We cache the function "listen" returns
this.listenFunc = renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
});
// We cache the function "listenGlobal" returns
this.globalListenFunc = renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
}
ngOnDestroy() {
// We execute both functions to remove the respectives listeners
// Removes "listen" listener
this.listenFunc();
// Removs "listenGlobal" listener
this.globalListenFunc();
}
นี่คือplnkrพร้อมตัวอย่างที่ใช้งานได้ ตัวอย่างที่มีการใช้งานของและlisten
listenGlobal
การใช้ RendererV2 กับ Angular 4.0.0-rc.1 + (Renderer2 ตั้งแต่ 4.0.0-rc.3)
RendererV2
ไม่มีlistenGlobal
ฟังก์ชั่นเพิ่มเติมสำหรับกิจกรรมทั่วโลก (เอกสาร, เนื้อหา, หน้าต่าง) มันมีlisten
ฟังก์ชั่นที่ใช้งานได้ทั้งสองฟังก์ชั่นเท่านั้น
สำหรับการอ้างอิงฉันคัดลอก & วางรหัสแหล่งที่มาของการใช้งาน DOM Renderer เนื่องจากอาจเปลี่ยนแปลงได้ (ใช่มันเป็นเชิงมุม!)
listen(target: 'window'|'document'|'body'|any, event: string, callback: (event: any) => boolean):
() => void {
if (typeof target === 'string') {
return <() => void>this.eventManager.addGlobalEventListener(
target, event, decoratePreventDefault(callback));
}
return <() => void>this.eventManager.addEventListener(
target, event, decoratePreventDefault(callback)) as() => void;
}
อย่างที่คุณเห็นตอนนี้มันจะตรวจสอบว่าเรากำลังผ่านสตริง (เอกสารร่างกายหรือหน้าต่าง) ซึ่งในกรณีนี้มันจะใช้addGlobalEventListener
ฟังก์ชั่นภายใน ในกรณีอื่น ๆ เมื่อเราผ่านองค์ประกอบ (nativeElement) มันจะใช้ง่ายaddEventListener
ในการลบผู้ฟังมันก็เหมือนกับRenderer
ในเชิงมุม 2.x listen
ส่งคืนฟังก์ชันจากนั้นเรียกใช้ฟังก์ชันนั้น
ตัวอย่าง
// Add listeners
let global = this.renderer.listen('document', 'click', (evt) => {
console.log('Clicking the document', evt);
})
let simple = this.renderer.listen(this.myButton.nativeElement, 'click', (evt) => {
console.log('Clicking the button', evt);
});
// Remove listeners
global();
simple();
plnkrพร้อมAngular 4.0.0-rc.1โดยใช้RendererV2
plnkrพร้อมAngular 4.0.0-rc.3โดยใช้Renderer2