2016-01-02 12 views
14

मैं तीन घटक होते हैं: अनुप्रयोग, जनक, एवं बाल:@ContentChildren आबादी किया जा रहा है

अनुप्रयोग घटक

@Component({ 
    selector: 'app', 
    directives: [Parent,Child], 
    template: '<parent><child>hi</child><child>there</child></parent>' 
}) 
export class AppComponent { 
    constructor() { 
    } 
} 

जनक घटक

@Component({ 
    selector: 'parent', 
    template: '<div><h1>Parent</h1><ng-content></ng-content></div>' 
}) 
export class Parent { 
    @ContentChildren(Child) children: QueryList<Child>; 
    ngAfterContentInit() { 
     console.log(this.children); 
    } 
} 

बाल घटक

@Component({ 
    selector: 'child', 
    template: '<div><h1>Child</h1></div>' 
}) 
export class Child { 
} 

आप जनक घटक में देख सकते हैं, मैं @ContentChildren उपयोग करने के लिए बाल घटकों की सूची प्राप्त करने की कोशिश की है, एक चयनकर्ता के रूप में Child प्रकार का उपयोग। हालांकि, यह काम नहीं प्रतीत होता है - सामग्री बच्चों की सूची हमेशा अनिर्धारित होती है।

ngAfterContentInit() विधि में, मैं उम्मीद है | सामग्री बच्चों आबादी वाले किया जाना है।

क्या मुझे कुछ याद आ रही है?

[अपडेट]

तो यह पता चला है कि समस्या मौजूद है जब सभी तीन घटकों एक ही फाइल में हैं (कंसोल डिबग विंडो देखते हैं, जहां मैं उत्पादन सामग्री बच्चों):

Plnkr Demo of Issue

वे अलग फ़ाइलों में हैं, तो समस्या दूर हो जाने:

Plnkr Demo Working

आम तौर पर, मैं केवल सीखने प्रयोजनों के लिए एक ही फाइल में सभी घटकों को रखते हैं। लेकिन यह मुझे उत्सुक है। क्या कोई जानता है कि व्यवहार अलग क्यों है?

+0

बच्चों डोम में दिखाई दे रहे हैं? मैंने अभी कोशिश की (डार्ट में) और यह काम कर रहा है। आप एक अधिक अनुमोदक प्रकार की तुलना में '' any' की तरह चर के लिए QueryList 'कोशिश की है। –

+0

@ GünterZöchbauer मैं किसी भी करने के लिए प्रकार बदलने लेकिन समस्या अभी भी वहाँ है की कोशिश की। ऐसा लगता है कि यह एक ही फाइल में होने वाले सभी तीन घटकों से संबंधित है। – pixelbits

+0

मैं डार्ट में पुन: पेश नहीं कर सकता (अगर यह कोई मदद है), यह एक फ़ाइल में सब कुछ के साथ भी काम करता है। –

उत्तर

20

आप forwardRef उपयोग करने के लिए जो अभी तक परिभाषित नहीं कर रहे हैं वर्गों को संदर्भित करने की जरूरत है। this plunk देखें। ES6 classes are not hoisted याद रखें।

@Component({ 
    selector: 'parent', 
    template: '<div><h1>Parent</h1><ng-content></ng-content></div>' 
}) 
export class Parent { 
    @ContentChildren(forwardRef(() => Child)) children; // <!- HERE 

    ngAfterContentInit() { 
     console.log(this.children); 
     console.log(this.children.length); 
    } 
} 

युपीडी मार्क Rajcok angular2 में आगे संदर्भ (देखें टिप्पणी bellow) के बारे में एक बहुत अच्छा लेख ने बताया। पढ़ना चाहिए: thoughtram.io Forward references in Angular 2

+0

यह बताता है कि यह डार्ट में क्यों काम कर रहा है। –

+1

+1, मुझे पोस्ट पर हराया। ओपी, ध्यान दें कि [केवल 'माता-पिता' से पहले 'चाइल्ड' घोषित करना] (http://plnkr.co/edit/64OJMwOwEle6wNycwwDz?p=preview) एक ही फ़ाइल में भी काम करता है। – drewmoore

+1

बस एफवाईआई, 'फॉरवर्डरफ() 'का उपयोग [निर्भरता इंजेक्शन देव गाइड] (https://angular.io/docs/ts/latest/guide/dependency- इंजेक्शन) में किया गया है।एचटीएमएल), पृष्ठ के निचले भाग के पास, "परिशिष्ट: हम प्रति फ़ाइल एक वर्ग की अनुशंसा क्यों करते हैं" खंड में। गाइड 'फॉरवर्ड पोस्ट' का उपयोग करने के बारे में अधिक जानकारी के लिए गाइड [इस ब्लॉग पोस्ट] को पढ़ने की भी सिफारिश करता है (http://blog.thoughtram.io/angular/2015/09/03/forward-references-in-angular-2.html)() '। –

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