AngularJS से $scope.emit()
या इसके बराबर कोई नहीं है $scope.broadcast()
। एक घटक के अंदर EventEmitter करीब आता है, लेकिन जैसा कि आपने उल्लेख किया है, यह केवल तत्काल मूल घटक के लिए एक घटना का उत्सर्जन करेगा।
कोणीय में, अन्य विकल्प हैं जो मैं नीचे समझाने की कोशिश करूंगा।
@Input () बाइंडिंग एप्लिकेशन मॉडल को एक निर्देशित ऑब्जेक्ट ग्राफ (पत्तियों को रूट) में जोड़ने की अनुमति देता है। किसी घटक की परिवर्तन डिटेक्टर रणनीति का डिफ़ॉल्ट व्यवहार किसी भी जुड़े घटक से सभी बाइंडिंग के लिए एक आवेदन मॉडल में सभी परिवर्तनों का प्रचार करना है।
इसके अलावा: दो प्रकार के मॉडल हैं: मॉडल और एप्लिकेशन मॉडल देखें। एक एप्लिकेशन मॉडल @Input () बाइंडिंग के माध्यम से जुड़ा हुआ है। एक दृश्य मॉडल सिर्फ एक घटक संपत्ति है (@Input () के साथ सजाया नहीं गया है) जो घटक के टेम्पलेट में बंधा हुआ है।
अपने सवालों के जवाब देने के लिए:
क्या होगा अगर मुझे सिबलिंग घटकों के बीच संवाद करने की आवश्यकता है?
साझा किया गया एप्लिकेशन मॉडल : भाई-बहन एक साझा एप्लिकेशन मॉडल (कोणीय 1 की तरह) के माध्यम से संवाद कर सकते हैं। उदाहरण के लिए, जब एक भाई किसी मॉडल में बदलाव करता है, तो दूसरे भाई जिस मॉडल से बाइंडिंग करते हैं, वह स्वचालित रूप से अपडेट हो जाता है।
घटक ईवेंट : चाइल्ड घटक @Output () बाइंडिंग का उपयोग करके किसी ईवेंट को मूल घटक में उत्सर्जित कर सकते हैं। मूल घटक ईवेंट को संभाल सकता है, और एप्लिकेशन मॉडल में हेरफेर कर सकता है या यह स्वयं का दृश्य मॉडल है। एप्लिकेशन मॉडल में परिवर्तन स्वचालित रूप से सभी घटकों के लिए प्रचारित किया जाता है जो प्रत्यक्ष या अप्रत्यक्ष रूप से एक ही मॉडल से जुड़ते हैं।
सेवा ईवेंट : घटक सेवा ईवेंट की सदस्यता ले सकते हैं। उदाहरण के लिए, दो भाई घटक एक ही सेवा घटना के लिए सदस्यता ले सकते हैं और अपने संबंधित मॉडल को संशोधित करके जवाब दे सकते हैं। इस पर अधिक नीचे।
मैं एक रूट घटक और एक घटक के बीच संवाद कैसे कर सकता हूं जिसमें कई स्तर गहरे हैं?
- साझा किए गए एप्लिकेशन मॉडल : एप्लिकेशन मॉडल को रूट घटकों से नीचे @ नेपुट () बाइंडिंग के माध्यम से गहराई से नेस्टेड घटकों को पास किया जा सकता है। किसी भी घटक से एक मॉडल में परिवर्तन स्वचालित रूप से सभी घटकों को प्रचारित करेगा जो समान मॉडल साझा करते हैं।
- सेवा कार्यक्रम : आप EventEmitter को एक साझा सेवा में भी स्थानांतरित कर सकते हैं, जो किसी भी घटक को सेवा को स्कैन करने और घटना की सदस्यता लेने की अनुमति देता है। इस तरह, एक रूट घटक एक सेवा पद्धति (आमतौर पर मॉडल को बदलने) को कॉल कर सकता है, जो बदले में एक घटना का उत्सर्जन करता है। कई परतें नीचे, एक भव्य-बाल घटक जिसने सेवा को भी इंजेक्ट किया है और उसी घटना के लिए सदस्यता ली है, इसे संभाल सकता है। कोई भी ईवेंट हैंडलर जो एक साझा एप्लिकेशन मॉडल को बदलता है, स्वचालित रूप से उस पर निर्भर सभी घटकों को प्रचारित करेगा। यह संभवतः
$scope.broadcast()
कोणीय 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));
}
}
संदर्भ: एंगुलर में परिवर्तन का पता लगाएं