2016-02-24 17 views
8

में घटकों के बीच पॉलीमोर्फिज्म मेरे पास माता-पिता के बच्चे हैं जो विभिन्न वर्ग (मॉडल) हैं। प्रत्येक बच्चे का अपना रूप होता है, लेकिन मैं उस घटक को चाहता हूं जिसके माता-पिता के संदर्भ बच्चे के आधार पर विशिष्ट रूप प्रस्तुत करते हैं। एक उदाहरण:angular2

मॉडल

export interface Item { 
    title: string; 
} 

export class Exercise implements Item { 
    constructor(public title:string, public description:string); 
} 

export class Break implements Item { 
    constructor(public title:string, public time:number); 
} 

फार्म

@Component({ 
    selector: 'item-form', 
    template: `<item></item> 
    `, 
    inputs: ['model:item'] 
}) 
export abstract class ItemFormComponent { 
    model: Item; 
} 

@Component({ 
    selector: 'item-form', 
    template: ` 
     <form #exerciseForm="ngForm"> 
      <input type="text" class="form-control" required 
      [(ngModel)]="model.title" 
      ngControl="title" #name="ngForm" > 
      <input type="text" class="form-control" required 
      [(ngModel)]="model.description" 
      ngControl="desription" #name="ngForm" > 
     </form> 
    `, 
    providers: [ExerciseService], 
    inputs: ['model:exercise'] 
}) 
export class ExerciseFormComponent extends ItemFormComponent { 
    model = new Exercise("Title", "Description"); 

    constructor(private _exerciseService: ExerciseService) { 
     super(); 
    } 
} 

@Component({                       
    selector: 'item-form',                    
    template: ` 
     <form #exerciseForm="ngForm"> 
      <input type="text" class="form-control" required 
      [(ngModel)]="model.title" 
      ngControl="title" #name="ngForm" > 
      <input type="text" class="form-control" required 
      [(ngModel)]="model.time" 
      ngControl="number" #name="ngForm" > 
     </form> 
    `,              
    inputs: ['model:break']                   
})                                                   
export class BreakFormComponent extends ItemFormComponent {           
    model = new Break("Title", 10);                    

} 

अनुप्रयोग

@Component({ 
     selector: 'app', 
     template: ` 
      <h1>App</h1> 
      <div *ngFor="#item of items"> 
       <item-form [model]="item"></item-form> <!-- HERE IS WHERE FORM SHOULD BE INSERTED! --> 
      </div> 
     `, 
     directives: [ItemFormComponent] 
}) 
export class App { 
    items: Item[] = [new Exercise("Exercise", "Description"), new Break("Break", 10)]; 
} 
+1

टाइपस्क्रिप्ट बहुरूपता का समर्थन करता है, लेकिन कोणीय एनोटेशन नहीं करता है। मुझे लगता है कि आपको निर्देश फ़ील्ड में कक्षा का सटीक नाम निर्दिष्ट करना होगा, न कि अमूर्त सुपरक्लास। – MatthewScarpino

+0

क्या यह "माता-पिता के बच्चे हैं।" वास्तव में माता-पिता के संबंधों के बारे में या क्या इसका अर्थ सुपरक्लास-सबक्लास संबंध है? –

+0

कोणीय कुकबुक की डायनामिक फॉर्म रेसिपी में 'कंट्रोल टाइप' प्रॉपर्टी के साथ आधार प्रश्न वर्ग है जो क्लास का इस्तेमाल नियंत्रण को इंगित करने के लिए किया जाता है, और स्विच कंट्रोल के रूप में 'कंट्रोल टाइप' का उपयोग करके स्विच कथन के साथ एक प्रश्न घटक, और ए प्रत्येक अंतर नियंत्रण के मामले में सवाल का उपयोग किया जा सकता है: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html यह सबसे अच्छा हो सकता है जो आप कर सकते हैं। – Ergwun

उत्तर

1

मुझे लगता है कि आप की तरह कुछ की जरूरत है:

 <div *ngFor="#item of items"> 
      <item-form-a *ngIf="item instanceOf A" [model]="item"></item-form-a> 
      <item-form-b *ngIf="item instanceOf B" [model]="item"></item-form-a> 
     </div> 

मैं टाइपप्रति का उपयोग नहीं करते और अगर instanceOf कोणीय भाव में समर्थित है पता नहीं है। यदि नहीं, तो आपको App के फ़ंक्शन पर चेक स्थानांतरित करने की आवश्यकता होगी और इसे *ngIf="isInstanceOf(item, A) पर कॉल करें।

+2

मैंने '* ngIf =" आइटम उदाहरण के साथ परीक्षण किया "" लेकिन यह समर्थित नहीं है। मैं इसके अलावा मैंने '* ngIf =" isInstanceOf (आइटम, ए) 'के साथ प्रयास किया है, लेकिन ए हमेशा अनिर्धारित है। मुझे नहीं पता क्यों। इसलिए मैंने बनाया: '* ngIf =" isA (item) 'लेकिन आइटम वस्तु का इरादा है! ? –

+0

किसी भी तरह की उम्मीद थी। प्रकार घटक वर्ग के सदस्य नहीं हैं और बाइंडिंग घटक के बाहर चीजों को संदर्भित करने की अनुमति नहीं देते हैं। इसलिए 'ए' का उपयोग बाध्यकारी अभिव्यक्तियों में बिल्कुल नहीं किया जा सकता है। मुझे नहीं पता कि 'isA (आइटम) {वापसी आइटम उदाहरण क्यों है; } 'काम नहीं करता है। मैं टीएस का उपयोग नहीं करता हूं, मैंने टाइप प्रकार की जांच की है। हो सकता है कि आपको एक कामकाज की आवश्यकता हो ताकि आइटम एक ऐसी संपत्ति प्रदान कर सकें जो उनके प्रकार की जांच करने की अनुमति देता है (जैसे कक्षा के नाम वाले स्ट्रिंग फ़ील्ड)। –

+0

@Franb: यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है और इसलिए इसे इस तरह चिह्नित नहीं किया जाना चाहिए। –