2016-11-28 15 views
11

Không thể có các phần tử nhập biểu mẫu trong một nội dung ng và có "kết nối" với cá thể ngForm của thành phần gốc không?Q: Cách sử dụng mẫu biểu mẫu Angular 2 với ng-content?

Hãy mẫu cơ bản này cho một thành phần cha mẹ:

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

Sau đó, bên trong thành phần con, được đặt bên trong "ng-content", một cái gì đó như thế này:

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

On nộp của hình thức cha mẹ, các điều khiển con không có sẵn, điều này cũng có nghĩa là sự bẩn thỉu/xác thực của bất kỳ thứ gì trong thành phần con không được phản ánh trên biểu mẫu cha mẹ.

Điều gì bị thiếu ở đây?

+0

Tôi chắc chắn điều này sẽ không hoạt động. Phần tử này chỉ được hiển thị trong thành phần con nhưng nó vẫn là phần tử con của phần tử cha. –

+0

@ GünterZöchbauer Có cách nào để treo lên các trường nhập con với biểu mẫu (ngForm) trong thành phần chính không? Với ReactiveForms tôi có thể cư trú FormGroup cha và sử dụng [formGroup] trên thành phần con, nhưng không thể với các mẫu được định dạng mẫu? – SondreB

+0

Điều đó cũng hoạt động với các biểu mẫu được định dạng mẫu. Đã không được thực hiện trong một thời gian. –

Trả lời

11

Có một cơ hội tốt là bạn đã đưa ra giải pháp khác vào thời điểm này nhưng tôi đã tìm ra cách để thực hiện việc này. Hy vọng rằng nó sẽ giúp bạn hoặc người khác.

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); 
    } 
} 

Sau đó, bạn có thể sử dụng nó trong mẫu của bạn như thế này:

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

Khi bạn gửi biểu mẫu, bạn sẽ thấy rằng các projectedInput điều khiển biểu mẫu được thêm vào NgForm.

Lưu ý: Tôi chỉ thử thêm đầu vào dự kiến ​​từ móc vòng đời của AfterViewInit. Nó có thể hoạt động sớm hơn, tôi không chắc. Cũng có thể có một số vấn đề với việc này mà tôi không biết. YMMV.

+0

Nếu bạn chỉ định '{con cháu: true}' cho 'ContentChildren', thì nó cũng sẽ lấy con cháu và bạn không cần phải nhập vào dưới dạng con trực tiếp :) – Carlos

+1

Khi tôi viết câu trả lời này, tôi không có may mắn với cách tiếp cận đó. Tôi không chắc đó có phải là lỗi hay không, nhưng đó là điều đầu tiên tôi thử. Tôi đã không thử nó kể từ cuối phiên bản beta Angular 2. – instantaphex

+0

bất kỳ phản hồi hoặc tài liệu chính thức nào ở trên? – Jek

Các vấn đề liên quan