ไม่มีอะไรเทียบเท่า$scope.emit()
หรือ$scope.broadcast()
จาก AngularJS EventEmitter ด้านในขององค์ประกอบใกล้เข้ามา แต่อย่างที่คุณพูดถึงมันจะส่งเหตุการณ์ไปยังองค์ประกอบหลักเท่านั้น
ในเชิงมุมมีทางเลือกอื่นที่ฉันจะพยายามอธิบายด้านล่าง
@Input () bindings อนุญาตให้โมเดลแอปพลิเคชันเชื่อมต่อในกราฟวัตถุที่กำหนดทิศทาง (root to leaves) พฤติกรรมเริ่มต้นของกลยุทธ์เครื่องมือตรวจจับการเปลี่ยนแปลงของส่วนประกอบคือการเผยแพร่การเปลี่ยนแปลงทั้งหมดในรูปแบบของแอปพลิเคชันสำหรับการผูกทั้งหมดจากองค์ประกอบที่เชื่อมต่อใด ๆ
ด้านข้าง: มีสองรุ่น: ดูรุ่นและรุ่นของแอปพลิเคชัน โมเดลของแอปพลิเคชันเชื่อมต่อผ่านการผูก @Input () รูปแบบการดูเป็นเพียงคุณสมบัติของส่วนประกอบ (ไม่ได้ตกแต่งด้วย @Input ()) ซึ่งถูกผูกไว้ในแม่แบบของส่วนประกอบ
เพื่อตอบคำถามของคุณ:
ถ้าฉันต้องการสื่อสารระหว่างส่วนประกอบของพี่น้อง
Shared Application Model : พี่น้องสามารถสื่อสารผ่านโมเดลแอปพลิเคชันที่ใช้ร่วมกันได้ (เช่นเดียวกับเชิงมุม 1) ตัวอย่างเช่นเมื่อพี่น้องหนึ่งทำการเปลี่ยนแปลงกับโมเดลพี่น้องอื่น ๆ ที่มีการเชื่อมโยงกับโมเดลเดียวกันจะถูกอัพเดตโดยอัตโนมัติ
เหตุการณ์ส่วนประกอบ : องค์ประกอบลูกสามารถส่งเหตุการณ์ไปยังองค์ประกอบหลักโดยใช้ @Output () การเชื่อมโยง คอมโพเนนต์พาเรนต์สามารถจัดการกับเหตุการณ์และจัดการโมเดลแอ็พพลิเคชันหรือเป็นโมเดลมุมมองของตัวเอง การเปลี่ยนแปลงรูปแบบของแอปพลิเคชันจะแพร่กระจายโดยอัตโนมัติไปยังส่วนประกอบทั้งหมดที่ผูกโดยตรงหรือโดยอ้อมกับรุ่นเดียวกัน
กิจกรรมบริการ : ส่วนประกอบสามารถสมัครสมาชิกกับกิจกรรมบริการ ตัวอย่างเช่นสององค์ประกอบพี่น้องสามารถสมัครใช้งานบริการเดียวกันและตอบสนองโดยการปรับเปลี่ยนรูปแบบที่เกี่ยวข้อง เพิ่มเติมเกี่ยวกับเรื่องนี้ด้านล่าง
ฉันจะสื่อสารระหว่างองค์ประกอบรูทและส่วนประกอบที่ซ้อนกันหลายระดับได้อย่างไร
- Shared Application Model : โมเดลแอปพลิเคชันสามารถส่งผ่านจากรูทคอมโพเนนต์ไปยังคอมโพเนนต์ย่อยที่อยู่ลึกลงไปผ่านการผูก @Input () การเปลี่ยนแปลงโมเดลจากคอมโพเนนต์ใด ๆ จะเผยแพร่ไปยังคอมโพเนนต์ทั้งหมดที่ใช้โมเดลเดียวกันโดยอัตโนมัติ
- กิจกรรมบริการ : คุณสามารถย้าย EventEmitter ไปยังบริการที่ใช้ร่วมกันซึ่งอนุญาตให้ส่วนประกอบใด ๆ เพื่อฉีดบริการและสมัครรับกิจกรรม ด้วยวิธีนี้คอมโพเนนต์รูทสามารถเรียกใช้เมธอดเซอร์วิส (โดยทั่วไปจะกลายพันธุ์โมเดล) ซึ่งจะส่งเหตุการณ์ออกมา มีเลเยอร์หลายชั้นซึ่งเป็นองค์ประกอบของลูกหลานที่ฉีดบริการและสมัครเป็นสมาชิกของเหตุการณ์เดียวกันก็สามารถจัดการได้ ตัวจัดการเหตุการณ์ใด ๆ ที่เปลี่ยนโมเดลแอปพลิเคชันที่ใช้ร่วมกันจะเผยแพร่ไปยังคอมโพเนนต์ทั้งหมดที่ขึ้นอยู่กับมันโดยอัตโนมัติ นี่น่าจะใกล้เคียงที่สุดกับ
$scope.broadcast()
จาก Angular 1 ส่วนถัดไปอธิบายแนวคิดนี้ในรายละเอียดเพิ่มเติม
ตัวอย่างของบริการที่สังเกตได้ซึ่งใช้เหตุการณ์บริการเพื่อเผยแพร่การเปลี่ยนแปลง
นี่คือตัวอย่างของบริการที่สังเกตได้ซึ่งใช้กิจกรรมบริการเพื่อเผยแพร่การเปลี่ยนแปลง เมื่อมีการเพิ่ม TodoItem บริการจะปล่อยเหตุการณ์ที่แจ้งสมาชิกสมาชิก
export class TodoItem {
constructor(public name: string, public done: boolean) {
}
}
export class TodoService {
public itemAdded$: EventEmitter<TodoItem>;
private todoList: TodoItem[] = [];
constructor() {
this.itemAdded$ = new EventEmitter();
}
public list(): TodoItem[] {
return this.todoList;
}
public add(item: TodoItem): void {
this.todoList.push(item);
this.itemAdded$.emit(item);
}
}
นี่คือวิธีที่องค์ประกอบรูทจะสมัครสมาชิกของเหตุการณ์:
export class RootComponent {
private addedItem: TodoItem;
constructor(todoService: TodoService) {
todoService.itemAdded$.subscribe(item => this.onItemAdded(item));
}
private onItemAdded(item: TodoItem): void {
// do something with added item
this.addedItem = item;
}
}
องค์ประกอบย่อยที่ซ้อนกันหลายระดับลึกจะสมัครเป็นสมาชิกของเหตุการณ์ในลักษณะเดียวกัน:
export class GrandChildComponent {
private addedItem: TodoItem;
constructor(todoService: TodoService) {
todoService.itemAdded$.subscribe(item => this.onItemAdded(item));
}
private onItemAdded(item: TodoItem): void {
// do something with added item
this.addedItem = item;
}
}
นี่คือส่วนประกอบที่เรียกใช้บริการเพื่อทริกเกอร์เหตุการณ์ (สามารถอยู่ที่ใดก็ได้ในโครงสร้างส่วนประกอบ):
@Component({
selector: 'todo-list',
template: `
<ul>
<li *ngFor="#item of model"> {{ item.name }}
</li>
</ul>
<br />
Add Item <input type="text" #txt /> <button (click)="add(txt.value); txt.value='';">Add</button>
`
})
export class TriggeringComponent{
private model: TodoItem[];
constructor(private todoService: TodoService) {
this.model = todoService.list();
}
add(value: string) {
this.todoService.add(new TodoItem(value, false));
}
}
การอ้างอิง: การตรวจจับการเปลี่ยนแปลงในเชิงมุม