2017-06-16 32 views
0

在我們Angular 4 app,我們已經一個如何重置點擊父母的按鈕點擊數據和查看兒童輸入?

  • <parent-component>具有<form>
  • <form><level-1-child>
  • <level-1-child><level-2-child>
  • <level-2-child><textarea>

我們需要做什麼?

  • 復位<parent-component><form>元素,<level-1-child> & <level-2-child><button>點擊或提交<parent-component><form>

<parent-component>的是這樣的:

<form [formGroup]="myGroup" #f="ngForm" name="parent-component" (submit)="resetForm(f)" >  
    <input name="abc" id="abc" formControlName="abc">  
    <level-1-child [formGroup]="myGroup"></level-1-child>  
    <input type="submit" value="Reset form"> 
</form> 

而且<level-1-child>樣子這個:

<input name="abc" id="abc" formControlName="abc">  
<level-2-child [formGroup]="myGroup"> 
</level-2-child> 

而且<level-2-child>看起來是這樣的:

<div [formGroup]="myGroup"> 
    <textarea formControlName="abc" id="abc" name="abc" [(ngModel)]="level-2-child.txt" > 
    </textarea> 
</div> 

parent-component.ts代碼,level-1-child.ts & level-2-child.ts是以下行:

import { Component, OnInit } from '@angular/core'; 
import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms'; 

@Component({ 
    moduleId: module.id, 
    selector: 'parent-component', //level-1-child, level-2-child 
    templateUrl: 'parent-component.html' //level-1-child, level-2-child 
}) 

export class ParentComponent { //Level1Child, Level2Child 
    myGroup = new FormGroup({abc: new FormControl()}); 
} 

This code is only resetting the input#abc of <parent-component> . What is the fix for this?

我們試圖使遠?

作爲每@StepanZarubinsuggestion試過溶液1

,所述parent-component.ts是這樣的:

resetForm(f) {  
    f.resetForm();  
} 

與模板<parent-component>這樣的:

<form #f="ngForm" (submit)="resetForm(f)" > 
    <level-1-child> 
    <level-2-child> 
     <level-3-child> 
     ... 
      <level-n-child> 
      </level-n-child> 
     ... 
     </level-3-child> 
    </level-2-child> 
    </level-1-child> 
    <button type="submit"> Submit </button> 
</form> 

<level-n-child>模板是:

<input name="inp" id="inp" #inpField="ngModel" [(ngModel)]="childModel.inp"> 

但是,由於某些原因,這不是重置<level-n-child>input#inp元素。

試圖解決2

試圖解決3

Can't bind to 'parentFormGroup' since it isn't a known property of 'level-n-child'

試圖解決使用REACTIVE_FORM_DIRECTIVES此錯誤時拋出另一個錯誤:

[ts] Module '"node_modules/@angular/forms/forms"' has no exported member 'REACTIVE_FORM_DIRECTIVES'.

然而,we're already using the latest這不是主要問題。

試過溶液4

試過溶液5

可能的解決方法

我們不希望在這些組件上輸入/輸出很多雜亂的代碼。

有沒有辦法我們可以使用類似 共享服務這個?

+1

僅供參考REACTIVE_FORMS_DIRECTIVES已被棄用,在角2,RC6刪除。您需要改爲導入ReactiveFormsModule。此外,任何包含輸入元素的嵌套組件(例如'')都不會被默認視爲父窗體的一部分。您需要手動通知嵌套組件,它們是形成。(這是您與以下單詞鏈接的解決方案:「我們沒有考慮此建議。)然後重置可能會起作用嗎? – DeborahK

+0

@DeborahK那麼我們如何通知嵌套組件它們是表單的成員? – xameeramir

+1

您可以保留或者你可以看看是否有其他的方法來構建表單,而不需要深入到這麼多的層次上,也許你可以創建一個支持任何級別的''而不是擁有這麼多的嵌套組件。 – DeborahK

回答

1

來初始化「空」數據的形式,我做這樣的事情:

initializeProduct(): IProduct { 
    // Return an initialized object 
    return { 
     id: 0, 
     productName: null, 
     productCode: null, 
     tags: [''], 
     releaseDate: null, 
     price: null, 
     description: null, 
     starRating: null, 
     imageUrl: null 
    }; 
} 

,然後綁定到初始化產品。

你可以在這裏找到一個完整的例子:https://github.com/DeborahK/Angular2-ReactiveForms(特別是APM文件夾)。

該代碼可用於在Pluralsight我的「角無形式」當然,如果你想看到它是如何建造更多的細節:https://app.pluralsight.com/library/courses/angular-2-reactive-forms/table-of-contents

+0

這是我正在做的事情,但問題是我如何讓子組件知道父母想要它是'IProduct'以獲得空? – xameeramir

+0

你如何分享數據?如果數據在所有子組件之間共享,那麼父級可以簡單地將綁定屬性設置爲初始化產品,綁定將負責其餘部分。 – DeborahK

+0

我認爲在我們的應用程序中沒有任何綁定的屬性,所有兒童都可以訪問這些屬性。 – xameeramir