बच्चे को कोणीय 2 में माता-पिता की घटना के लिए सुनता है


82

कोणीय डॉक्स में माता-पिता से बच्चे की घटनाओं को सुनने के बारे में एक विषय है। कोई बात नहीं। लेकिन मेरा उद्देश्य कुछ उल्टा है! मेरे ऐप में एक 'admin.component' है जो कि व्यवस्थापक पृष्ठ (साइडबार मेनू, टास्क बार, स्टेटस आदि) का लेआउट दृश्य रखता है।)। इस मूल घटक में मैंने व्यवस्थापक के अन्य पृष्ठों के बीच मुख्य दृश्य को बदलने के लिए राउटर सिस्टम को कॉन्फ़िगर किया है। परिवर्तन के बाद चीजों को बचाने के लिए समस्या है, उपयोगकर्ता टास्क बार में सेव बटन पर क्लिक करता है (जो admin.com में रखा गया है) और चाइल्ड कंपोनेंट को सेव स्टाफ करने के लिए उस क्लिक इवेंट को सुनना चाहिए।


2
ऐसा करने के लिए सबसे अच्छा अभ्यास की तरह लगता है एक सेवा का उपयोग कर रहा है और घटना को देखने योग्य है।
zpul

आपका प्रश्न इस एक से बहुत अलग नहीं है: stackoverflow.com/questions/35560860/…
freethebees

@freethebees शायद समाधान एक ही है, लेकिन समस्या का आकार अलग है और मेरा इरादा इस स्थिति के लिए सबसे अच्छा तरीका ढूंढना है।
हमीद

हम चाइल्ड कंपोनेंट को दिए गए एकल ईवेंट के लिए एक सर्विस सेटअप करने नहीं जा रहे हैं।
TR3B

जवाबों:


101

मुझे लगता है कि यह डॉक्टर आपके लिए उपयोगी हो सकता है:

वास्तव में आप एक अवलोकन योग्य / विषय का लाभ उठा सकते हैं जो अभिभावक अपने बच्चों को प्रदान करता है। ऐसा कुछ:

@Component({
  (...)
  template: `
    <child [parentSubject]="parentSubject"></child>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  parentSubject:Subject<any> = new Subject();

  notifyChildren() {
    this.parentSubject.next('some value');
  }
}

बच्चे का घटक इस विषय पर सदस्यता ले सकता है:

@Component({
  (...)
})
export class ChildComponent {
  @Input()
  parentSubject:Subject<any>;

  ngOnInit() {
    this.parentSubject.subscribe(event => {
      // called when the notifyChildren method is
      // called in the parent component
    });
  }

  ngOnDestroy() {
    // needed if child gets re-created (eg on some model changes)
    // note that subsequent subscriptions on the same subject will fail
    // so the parent has to re-create parentSubject on changes
    this.parentSubject.unsubscribe();
  }

}

अन्यथा, आप एक साझा सेवा का लाभ उठा सकते हैं जिसमें इस तरह के विषय शामिल हों ...


मेरे चाइल्ड कंपोनेंट में कॉलबैक तब तक नहीं चलेगा जब तक कि पेरेंट कंपोनेंट नेक्स्ट इनइट से अगले वैल्यू को ब्रॉडकास्ट न कर दे। वह मामला क्या है?
cjsimon

5
ViewChild पर इस पद्धति का उपयोग करने के कोई लाभ हैं?
sunnyiitkgp

यद्यपि यह अधिक पेशेवर दिखता है, अपनी स्थिति में प्रयोग करने के लिए कुछ घंटे देने के बाद मैं बाल तत्वों को जोड़ने / हटाने (और इस प्रकार विषय से हटकर) पर अनसब्सक्राइबर्स के साथ परेशानी से बाहर नहीं निकल सका। तो TimeBoxing के माध्यम से मैं @StephenPaul के अधिक सीधे जवाब के लिए चला गया। वैसे भी उत्तर के लिए धन्यवाद और शायद मैं अभी पूरी तरह से इसे समझने और अपने उदाहरण के लिए सही (अतिरिक्त) समायोजन करने के लिए rxjs पुस्तकालय को पर्याप्त रूप से काम नहीं करता है।
बर्नौली आईटी

116

उत्तर-आधुनिकता के लिए , बस मैंने सोचा कि मैं इसके लिए और अधिक पारंपरिक समाधान का उल्लेख करूंगा : बस ViewChild का संदर्भ प्राप्त करें और फिर इसके तरीकों में से एक को सीधे कॉल करें।

@Component({
  selector: 'app-child'
})
export class ChildComponent {

  notifyMe() {
    console.log('Event Fired');
  }
}

@Component({
  selector: 'app-parent',
  template: `<app-child #child></app-child>`
})
export class ParentComponent {

  @ViewChild('child')
  private child: ChildComponent;

  ngOnInit() {
    this.child.notifyMe();
  }
}

3
यह जैसे ही मैंने माता-पिता घटक दर्ज दुर्घटनाओं ... Cannot read property 'notifyMe' of undefined
तरह यूजर

1
@ThierryTemplier के किसी भी तरह से अधिक पेशेवर भावना समाधान की तुलना में इस बहुत ही कठिन समाधान के लिए गए (मेरी टिप्पणी देखें)।
बर्नौली आईटी

2
@BernoulliIT आप एक अच्छा बिंदु बनाते हैं। मुझे लगता है कि दिन के अंत में वे लगभग एक ही बात को पूरा करते हैं। मेरा समाधान कम कोड का उपयोग करता है। उनके समाधान का अर्थ यह है कि मूल घटक को संदेश भेजने के लिए बच्चे के घटक को इंजेक्ट नहीं करना पड़ता है। आरएक्सजेएस महान है, लेकिन मैं अक्सर इसे कोणीय परियोजनाओं के भीतर अति प्रयोग देखता हूं। लोग इसे इसकी 'सिल्वर बुलेट' या कुछ और समझते हैं। यह वास्तव में चीजों को बहुत अधिक जटिल बना सकता है जितना कि उन्हें होना चाहिए। उनकी ngOnDestroy()पद्धति के अंदर उनकी टिप्पणी को देखें । जहाँ तक मेरा सवाल है, वह बहुत अस्पष्ट है। IMHO होने की प्रतीक्षा में बस एक बग है।
स्टीफन पॉल

1
"उनकी ngOnDestroy () पद्धति के अंदर उनकी टिप्पणी को देखें।" मुझे लगता है कि जब मैं उस दृष्टिकोण की कोशिश कर रहा था, तब से मैं "पीड़ित" था, तो मैं फंस गया और मेरे पास इतना समय नहीं था कि मैं आगे की जांच करूं (एक व्यावसायिक परियोजना के लिए जो मैं काम करता हूं)। हालाँकि इसने मेरे पेशेवर दिल को थोड़ा आहत किया;)
बर्नौली आईटी

1
धन्यवाद @StephenPaul, मेरे लिए पेरेंट कॉल्स एक व्यूचिल्ड विधि अच्छा था, लेकिन आपके उत्तर ने मुझे मेरे भाग्य तक पहुंचने में मदद की!
MKJ

14

यदि मैं प्रश्न को सही ढंग से समझ पाता हूं तो अधिक नंगे हड्डियों का दृष्टिकोण यहां संभव हो सकता है। मान्यताओं -

  • ओपी के पास मूल घटक में एक सेव बटन है
  • जिस डेटा को सहेजना है, वह बाल घटकों में है
  • अन्य सभी डेटा जिन्हें बच्चे के घटक की आवश्यकता हो सकती है उन्हें सेवाओं से एक्सेस किया जा सकता है

मूल घटक में

<button type="button" (click)="prop1=!prop1">Save Button</button>
<app-child-component [setProp]='prop1'></app-child-component>

और बच्चे में ..

prop1:boolean;
  @Input()
  set setProp(p: boolean) {
    // -- perform save function here
}

यह केवल बच्चे के घटक के लिए बटन क्लिक भेजता है। वहां से बाल घटक डेटा को स्वतंत्र रूप से बचा सकता है।

EDIT: यदि पैरेंट टेम्पलेट के डेटा को भी बटन क्लिक के साथ पास करना होगा, तो यह इस दृष्टिकोण के साथ भी संभव है। मुझे बताएं कि क्या ऐसा है और मैं कोड नमूने को अपडेट कर दूंगा।


0

जो मिल रहे हैं उनके लिए Cannot read property 'notifyMe' of undefined

विधि के अंदर कॉल करके देखें ngAfterViewInit()की inteadngOnInit()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.