2016-11-28 19 views
11

Bir ng içeriğinde form giriş öğelerinin olması ve ana bileşenin ngForm örneğine "bağlanması" mümkün mü?S: ng içeriğiyle Açısal 2 şablon formu nasıl kullanılır?

<form (ngSubmit)="onSubmit(editForm)" #editForm="ngForm" novalidate>    
<ng-content></ng-content> 
<button type="submit">Submit</button> 
</form> 

O zaman bu gibi içeri "ng-içerik", bir şey konur çocuk bileşeni, iç:

<input type="text" [(ngModel)]="user.firstName" #firstName="ngModel" name="firstName" required minlength="2"> 

On teslim

bir ebeveyn bileşeni için bu temel şablonu alın Ebeveyn formu, çocuk kontrolleri mevcut değildir, bu da çocuk bileşenindeki her şeyin kirli/onaylanmasının ana forma yansıtılmadığı anlamına gelir.

Burada eksik olan nedir?

+0

Bunun işe yaramadığından eminim. Öğe, alt öğe bileşeninde görüntülenir, ancak yine de ana öğenin bir alt öğesidir. –

+0

@ GünterZöchbauer Alt giriş alanındaki form (ngForm) ile alt giriş alanlarını bağlamanın bir yolu var mı? ReactiveForms ile ana FormGroup'u doldurabilir ve alt öğe üzerinde [formGroup] kullanabilir, ancak şablonla çalıştırılan formlarda imkansız olabilir miyim? – SondreB

+0

Bu, şablonla çalışan formlarla da çalışmalıdır. Bir süredir yapmadım. –

cevap

11

Bu noktada başka bir çözüm bulduğunuz için iyi bir şans var ama bunu yapmanın bir yolunu buldum. Umarım size veya başka birine yardımcı olacaktır.

import { NgModel } from '@angular/forms'; 
import { Component, ContentChildren, ViewChild, QueryList, AfterViewInit } from '@angular/core'; 

@Component({ 
    selector: 'my-custom-form', 
    template: ` 
    <form (ngSubmit)="onSubmit(editForm)" #editForm="ngForm" novalidate>    
     <ng-content></ng-content> 
     <button type="submit">Submit</button> 
    </form> 
    `, 
}) 
export class MyCustomFormComponent implements AfterViewInit { 
    @ContentChildren(NgModel) public models: QueryList<NgModel>; 
    @ViewChild(NgForm) public form: NgForm; 

    public ngAfterViewInit(): void { 
    let ngContentModels = this.models.toArray(); 
    ngContentModels.forEach((model) => { 
     this.form.addControl(model); 
    }); 
    } 

    public onSubmit(editForm: any): void { 
    console.log(editForm); 
    } 
} 

Sonra böyle şablonunuzda kullanabilirsiniz:

<my-custom-form> 
    <input name="projectedInput" ngModel> 
</my-custom-form> 

formu gönderirken, projectedInput form denetimi NgForm eklendiğini göreceksiniz.

Not: Sadece çıkarılan girdileri AfterViewInit yaşam döngüsü kancasından eklemeye çalıştım. Daha erken işe yarayabilir, emin değilim. Bunu yapmamanın bazı sorunları olabilir. YMMV.

+0

Eğer '{descendants: true}' ile 'ContentChildren' için de belirtirseniz, o zaman torunları da ele geçirirsiniz ve doğrudan çocuk olarak girdilere sahip olmanıza gerek yoktur :) – Carlos

+1

Bu cevabı yazdığımda hiç bir yanıtım yoktu. Bu yaklaşımla şans. Bir böcek mi, ne olduğu konusunda emin değilim ama denediğim ilk şey buydu. Angular 2 beta'dan beri denemedim. – instantaphex

+0

Yukarıdaki herhangi bir resmi cevap veya dokümantasyon? – Jek