2016-02-23 16 views
8

सभी ट्यूटोरियल और उत्तर जो मैंने पाया है, केवल इनपुट घटक का उपयोग करके मूल घटक से एक घटक को पास करने के तरीके को दिखाता है लेकिन राउटर के भीतर यह बच्चा घटक क्या है आउटलेट और सीधे माता-पिता टेम्पलेट में नहीं ??कोणीय 2 पैरेंट घटक से रूटर आउटलेट

जैसे:

मुख्य घटक

@Component({ 
    selector: 'my-app', 
    template: ` 
      Main page 
      <router-outlet></router-outlet> 
       `, 
    directives: [ROUTER_DIRECTIVES] 
}) 

@RouteConfig([ 
    { path: '/contact', name: 'Contact', component: ContactComponent}, 
]) 

export class AppComponent{ 
    public num:Number = 123; 
} 





@Component({ 
    selector: 'contact-page', 
    template: 'contact page' 
}) 
export class ContactComponent{ 
    public num:Number; 
} 

तो इस उदाहरण में मुख्य घटक टेम्पलेट एक रूटर आउटलेट जहां बच्चे संपर्क घटक रेंडर किया जाएगा शामिल लेकिन मैं कैसे चर प्राप्त कर सकते हैं "संख्या" अभिभावक ऐप घटक से राउटर आउटलेट के अंदर मूल्यांकन किए गए बाल घटक में मूल्य ??

+1

यह भी देखें http://stackoverflow.com/questions/34363792/angular2-using-inputs-with-router-outlets – Blauhirn

उत्तर

0

वर्तमान में आप राउटर द्वारा जोड़े गए घटकों से बंधे नहीं जा सकते हैं। इसके बजाए या जोड़े गए घटक से या घटनाओं की सदस्यता लेने के लिए इसके बजाय एक साझा सेवा का उपयोग करें (एसओ पर पहले से कई उदाहरण हैं)।

भी देखें इस मुद्दे https://github.com/angular/angular/issues/4452 विशेष रूप से इस टिप्पणी https://github.com/angular/angular/issues/4452#issuecomment-153889558

+0

साझा सेवा आदर्श नहीं है अगर आपको लगता है कि उदाहरण के लिए आपके पास ऐसी सेवा है जो आपकी सभी ऐप सेटिंग्स प्राप्त करती है डेटाबेस से और आपको मुख्य घटक पर इनमें से कुछ सेटिंग्स को प्रदर्शित करने की आवश्यकता है जैसे पेज के शीर्ष पर एक ईमेल प्रदर्शित करना या फ़ोन नंबर और फिर आपको राउटर आउटलेट के माध्यम से संपर्क पृष्ठ पर इसे प्रदर्शित करने की आवश्यकता है यदि आपने सेवा एक ही विवरण प्राप्त करने के लिए आप एक ही पृष्ठ पर दो बार अजाक्स कॉल कर रहे होंगे। आशा है कि आप मेरा मुद्दा देखेंगे। –

+1

दरअसल मैं नहीं देखता कि सेवा का उपयोग कैसे करें और "एजेक्स कॉल दो बार करना" संबंधित हैं। आप 'ParentComponent' से डेटा पास करने के लिए केवल एक सेवा का उपयोग कर सकते हैं (जिसमें '<राउटर-आउटलेट>' और' PouterComponent' की प्रदाता सूची में इसे जोड़कर '<राउटर-आउटलेट>' में जोड़ा गया घटक शामिल है। जिस तरह से सेवा केवल 'ParentComponent' और इसके वंशजों के बीच साझा की जाती है। साझा सेवा स्वयं वैश्विक सेवा पर निर्भर हो सकती है जो AJAX कॉल करता है और उदाहरण के लिए डेटा पहले से ही पहले ही प्राप्त किया गया था, उदाहरण के लिए कैश किए गए परिणाम लौटाता है। –

+0

मैं आपके बिंदु को समझता हूं लेकिन विचार मैं खोज कर रहा हूं कि माता-पिता से दो बार परिणाम प्राप्त करने के बजाय और एक बार बच्चे से एक ही जानकारी प्राप्त करने के बजाय। परिणाम को कैशिंग करने का विचार इस डबल fetching को रोक सकता है लेकिन विचार है कि मैं लपेट नहीं सकता यदि आप परिणाम को मूल घटक में लाते हैं और आप इसे अपने बच्चों के पास भेज सकते हैं तो मैं ऐसा नहीं कर सकता अगर राउटर आउटलेट में इस मामले में बच्चा निहित है तो उसे हल नहीं कर सकता है? हल करने के लिए एक सरल तर्क होना चाहिए यह मुद्दा –

-1

अपने डेटा अपरिवर्तनीय है, तो आप RouteData उपयोग कर सकते हैं।

@Component({...}) 
@RouteConfig([ 
    { path: '/contact', name: 'Contact', component: ContactComponent, data: {num: 123}}, 
]) 
export class AppComponent { 
} 

@Component({...}) 
export class ContactComponent { 
    public num:Number; 
    constructor(data: RouteData) { 
    this.num = data.get('num'); 
    } 
} 

कुछ कॉन्फ़िगरेशन विकल्पों को पारित करने के लिए उपयोगी हो सकता है जिन्हें आप बाल मार्गों में हार्डकोड नहीं करना चाहते हैं। लेकिन यदि आप डेटा को बदलने की उम्मीद कर रहे हैं, तो आपको कुछ अन्य विधि की आवश्यकता होगी।

+0

यह कोणीय 2 राउटर की नवीनतम रिलीज में बहिष्कृत किया गया था। –

3

मैंने अभी इस सवाल पर ठोकर खाई है, यहां बताया गया है कि मैंने इसी तरह के मुद्दों को हल किया है।

मैं इसे हल करने के लिए एक सेवा का उपयोग करूंगा। फिर सभी बच्चों और माता-पिता के लिए संपत्ति निर्धारित करना संभव है, और सभी ग्राहकों के लिए परिवर्तन प्रचारित किए जाते हैं। सबसे पहले मैं एक निजी BehaviorSubject जो एक सार्वजनिक गेटर और सेटर है के साथ एक सेवा बनाना होगा, ReplaySubject संपुटित के लिए और केवल प्रत्यक्ष वापसी:

private _property$: BehaviorSubject<number> = new BehaviorSubject(1); 

set property(value: number) { 
    this._property$.next(value); 
} 

get property$(): Observable<number> { 
    return this._property$.asObservable(); 
} 

नई BehaviorSubject उपयोग करने का कारण (1), करने के लिए प्रारंभिक मूल्य निर्धारित करने के लिए है 1, तो सदस्यता लेने के लिए कुछ है।

माता-पिता में onInit, मैं करूंगा डिफ़ॉल्ट संपत्ति के मूल्य (संख्या) से:

private _propertySubscribtion: Subscription 

ngOnInit() { 
    // set default value to 5 
    this._componentService.property = 5; 

    // If property is updated outside parent 
    this._componentService.property$.subscribe(p => { 
     this.property = p; 
    }); 
} 

ngOnDestroy() { 
    this._propertySubscribtion.unsubscribe(); 
} 

एक में या बच्चे घटकों के के और अधिक, यह संभव परिवर्तन के लिए सदस्यता के लिए:

private _propertySubscribtion: Subscription 

ngOnInit() { 
    this._propertySubscribtion = this._componentService.property$.subscribe(p => { 
     this.property = p; 
    }); 
} 

ngOnDestroy() { 
    this._propertySubscribtion.unsubscribe(); 
} 

और अगर कुछ बच्चे या माता पिता संपत्ति अद्यतन करता है:

updateProperty() { 
    // update property 
    this._componentService.property = 8; 
} 

सभी ग्राहकों को इसके बारे में पता चल जाएगा।

+0

क्या कोई ऐसी विधि है जो संपत्ति को अपडेट किए बिना पहले उत्सर्जन के बाद संपत्ति मूल्य को हटा देती है? – PaladiN

+0

क्या मान को शून्य पर सेट करने के लिए पर्याप्त होगा। Http अनुरोध समाप्त होने से पहले मैं कभी-कभी प्रारंभिक मान के रूप में शून्य मान का उपयोग करता हूं। – DNRN

+0

हाँ। मैंने इसे शुरुआत में भी शून्य पर सेट कर दिया है और फिर ऑपरेशन के बाद मूल्य को शून्य पर सेट कर दिया है। इसके लिए धन्यवाद ... – PaladiN

संबंधित मुद्दे