मैं वर्तमान में कोणीय 2. उपयोग कर रहा हूँ आम तौर पर उपयोग हम @Output() addTab = new EventEmitter<any>();और फिर addTab.emit()माता-पिता घटक के लिए एक घटना फेंकना।
क्या कोई ऐसा तरीका है जिससे हम इसे माता-पिता से लेकर बच्चे तक के लिए कर सकते हैं?
मैं वर्तमान में कोणीय 2. उपयोग कर रहा हूँ आम तौर पर उपयोग हम @Output() addTab = new EventEmitter<any>();और फिर addTab.emit()माता-पिता घटक के लिए एक घटना फेंकना।
क्या कोई ऐसा तरीका है जिससे हम इसे माता-पिता से लेकर बच्चे तक के लिए कर सकते हैं?
जवाबों:
RxJs का उपयोग करते हुए , आप Subjectअपने मूल घटक में घोषणा कर सकते हैं और इसे Observableबाल घटक के रूप में पास कर सकते हैं, बाल घटक को इसके लिए सदस्यता लेने की आवश्यकता है Observable।
अभिभावक घटक
eventsSubject: Subject<void> = new Subject<void>();
emitEventToChild() {
this.eventsSubject.next();
}
अभिभावक एचटीएमएल
<child [events]="eventsSubject.asObservable()"> </child>
बाल-घटक
private eventsSubscription: Subscription;
@Input() events: Observable<void>;
ngOnInit(){
this.eventsSubscription = this.events.subscribe(() => doSomething());
}
ngOnDestroy() {
this.eventsSubscription.unsubscribe();
}
this.eventsSubject.next({data});माता-पिता में, फिर this.events.subscribe(({data}) => doSomething(data));बच्चे में।
eventsSubjectएक सब्जेक्ट के रूप में इसे सब्सक्राइब करने के बजाय एक ऑब्जर्वेबल में बदला जाए?
जहाँ तक मुझे पता है, 2 मानक तरीके हैं जो आप कर सकते हैं।
1. @ कप्तान
जब भी माता-पिता में डेटा बदलता है, तो बच्चे को इसके बारे में अधिसूचित किया जाता है। बच्चा उस पर कार्रवाई कर सकता है। यह एक बच्चे के साथ बातचीत करने का मानक तरीका है।
Parent-Component
public inputToChild: Object;
Parent-HTML
<child [data]="inputToChild"> </child>
Child-Component: @Input() data;
ngOnChanges(changes: { [property: string]: SimpleChange }){
// Extract changes to the input property by its name
let change: SimpleChange = changes['data'];
// Whenever the data in the parent changes, this method gets triggered. You
// can act on the changes here. You will have both the previous value and the
// current value here.
}
एक सेवा बनाना और साझा सेवा में एक अवलोकन का उपयोग करना। बच्चा इसकी सदस्यता लेता है और जब भी कोई बदलाव होता है, तो बच्चे को सूचित किया जाएगा। यह भी एक लोकप्रिय तरीका है। जब आप इनपुट के रूप में पास किए गए डेटा के अलावा कुछ और भेजना चाहते हैं, तो इसका उपयोग किया जा सकता है।
SharedService
subject: Subject<Object>;
Parent-Component
constructor(sharedService: SharedService)
this.sharedService.subject.next(data);
Child-Component
constructor(sharedService: SharedService)
this.sharedService.subject.subscribe((data)=>{
// Whenever the parent emits using the next method, you can receive the data
in here and act on it.})
<child [data]="inputToChild"> </child>संभवतः <child [data]="(inputToChild)"> </child>परिवर्तन प्राप्त करने के लिए होना चाहिए
मूल घटक में आप बच्चे के घटक विधि / चर का उपयोग करने के लिए @ViewChild () का उपयोग कर सकते हैं।
@Component({
selector: 'app-number-parent',
templateUrl: './number-parent.component.html'
})
export class NumberParentComponent {
@ViewChild(NumberComponent)
private numberComponent: NumberComponent;
increase() {
this.numberComponent.increaseByOne();
}
decrease() {
this.numberComponent.decreaseByOne();
}
}
अपडेट करें:
कोणीय 8 आगे -
@ViewChild(NumberComponent, { static: false })
numberComponentहो जाएगा जैसा कि होगा undefined।
माता-पिता को इस इनपुट से बांधने की अनुमति देने के लिए अपने बच्चे के घटक में @Input () डेकोरेटर का उपयोग करें।
बाल घटक में आप इसे इस रूप में घोषित करते हैं:
@Input() myInputName: myType
माता-पिता से एक संपत्ति को एक बच्चे को बाँधने के लिए आपको अपने साथ बाध्यकारी कोष्ठक और उनके बीच आपके इनपुट के नाम को जोड़ना होगा।
उदाहरण :
<my-child-component [myChildInputName]="myParentVar"></my-child-component>
लेकिन सावधान रहें, वस्तुओं को एक संदर्भ के रूप में पारित किया जाता है, इसलिए यदि बच्चे में ऑब्जेक्ट को अपडेट किया जाता है तो माता-पिता का संस्करण भी अपडेट किया जाएगा। इससे कुछ समय के लिए अवांछित व्यवहार हो सकता है। प्राथमिक प्रकारों के साथ मान की प्रतिलिपि बनाई जाती है।
आगे पढ़ने के लिए इसे पढ़ें:
डॉक्स: https://angular.io/docs/ts/latest/cookbook/component-communication.html