2017-04-07 3 views
2

Ich habe zwei Komponenten FormComponent und Test1Component.Warum ist ContentChild nicht definiert?

Test1Component verwendet ng-contentFormComponent

FormComponent.ts

import { Component, Input, Output, EventEmitter } from '@angular/core'; 

@Component({ 
    selector: 'app-form', 
    template:` 
     <div class="panel panel-default fcs-form"> 
     <div class="panel-header form-header"> 
       {{headerTitle}} 
     </div> 

     <div class="panel-body form-body"> 
      <ng-content select="[form-body]"></ng-content> 
     </div> 
     <div class="panel-footer text-center form-footer"> 
       <button class="btn btn-primary">{{resetBtnText}}</button> 
      <button class="btn btn-primary" (click)="saveForm()"> {{saveBtnText}} </button> 
      <button class="btn btn-primary">{{addBtnText}}</button> 
     </div> 
     </div> 
    ` 
}) 
export class FormComponent{ 
    @Input() headerTitle:string = "Header Title"; 
    @Input() saveBtnText:string = "Save"; 
    @Input() resetBtnText:string = "Reset"; 
    @Input() addBtnText:string = "Add"; 
    @Output() save:EventEmitter<any> = new EventEmitter(); 

    constructor(){} 

    saveForm(e: any){ 
    this.save.emit("save"); 
    console.log("FormComponent save"); 
    } 
} 

Test1Component.ts

import { Component, Inject, OnInit, ContentChild } from '@angular/core'; 
import { FormGroup, FormBuilder } from '@angular/forms'; 
import { FormComponent } from './form.component'; 

@Component({ 
    selector: 'app-test1', 
    template: ` 
    <app-form headerTitle="my header" (save)="saveForm(complexForm.value, $event)"> 
     <div form-body> 

      <div class="jumbotron"> 
       <form [formGroup]="complexForm" (ngSubmit)="submitForm(complexForm.value)"> 

        <div class="form-group"> 
         <label>First Name:</label> 
         <input class="form-control" type="text" placeholder="John" [formControl]="complexForm.controls['firstName']"> 
        </div> 

       </form> 
      </div> 

     </div> 
    </app-form> 
    ` 
}) 
export class Test1Component { 
    @ContentChild(FormComponent) contentChildForm: FormComponent; 

    complexForm : FormGroup; 

    constructor(private fb: FormBuilder){ 
    this.complexForm = fb.group({ 
     'firstName' : "", 
     'lastName': "", 
     'gender' : "Female", 
     'hiking' : false, 
     'running' : false, 
     'swimming' : false 
    }); 
    } 

    saveForm(){ 
    console.log(this.contentChildForm); 
    debugger; 
    console.log("Test1Component save"); 
    return true; 
    } 
} 

Warum Test1Component.saveForm() Anmeldung ist this.contentChildForm wird angezeigt als undefined?

Wie es zu beheben?

Dies ist der Plünderer, den ich https://plnkr.co/edit/xbTgRuSd7nBIrOWsE1zO gemacht habe, öffnen Sie bitte Konsole, um Protokolle zu sehen.

Antwort

3

würde ich @ViewChild in Ihrem Fall verwenden, weil ich mit Typ keine projizierbares Knoten nicht sehen FormComponent in Ihrem Test1Component

Modified Plunker

+1

der Tat denke ich, ist die richtige Antwort. Dies könnte nützlich sein, um zu wissen, wann '@ ViewChild' und' @ ContentChild' zu verwenden sind: http://stackoverflow.com/questions/34326745/whats-the-difference-between-viewchild-and-contentchild – SrAxi

+1

@SrAxi Das hat Dinge gemacht Konzeptuell klar und einfach zu folgen –

+0

@yurzui Wäre es sinnvoll, die ViewChild-Referenz zu verwenden, um Daten an das Kind zu übergeben? oder benutze Dekorierer? –

Verwandte Themen