2016-07-29 113 views
7

我想創建一個表單組件,其中組件提供<form>及其後代的表單內容,即控件。我正在使用反應形式的RC4。該組件應該使用這樣的:角度2表單遍佈組件

<my-formwizard [form]="form"> 
    <input formControlName="name" type="text" /> 
</my-formwizard> 

這裏是展示實施普拉克:http://plnkr.co/edit/OSzjDQD63lwoEsyqdLvw?p=preview

我碰到一個例外:類型錯誤:無法讀取空的特性「的setParent」

是否有實現跨多個組件的反應式表單傳播的方式?


UPDATE:RC5有更清晰的錯誤消息,並感謝peeskillet的輸入,formControlName可如果自定義指令獲取連接通過formGroup屬性FormGroup使用。更新後的普拉克顯示了跨兩個組件的工作傳播形式:

http://plnkr.co/edit/1VfIH5AYjoe7dmizw6ss?p=preview

+0

你的解決方案是真多一個黑客,並導致_two_'FormGroupDirective'要創建的實例,這是不是你想。 –

回答

6

在你Plunker,我不知道爲什麼你的ngForm

<my-formwizard [form]="form" ngForm="form"> 

但是這不應該存在。我認爲它甚至可能會創造出一種全新的形式。應該刪除。一旦你刪除,那麼你會遇到另一個問題,說沒有ControlContainerControlContainerFormGroupDirective[formGroup])。

問題是由formControlName造成的。如果您查看FormControlName directive的源代碼,並查看構造函數,則會看到它需要ControlContainer依賴項。但不僅如此,它還有一個裝飾器,這意味着它只會在主機注入器中查找ControlContainer

老實說,在這種情況下,我並不十分確定在這種情況下哪個噴油器用作主噴油器,但它看起來並不是帶有組指令的噴油器。也許是因爲你如何設置組件。

一個解決方案,我發現它而不是使用formControlName,而是使用[formControl],而只是通過一個FormControl實例。 FormControlDirective沒有這個問題(它需要一個ControlContainer),因爲它可以獨立使用。

所以,你可以做到這一點,而不是

<input [formControl]="nameCtrl" type="text" /> 

export class App { 

    form: FormGroup; 
    nameCtrl: FormControl; 

    constructor(fb: FormBuilder) { 
    this.nameCtrl = new FormControl(''); 
    this.form = fb.group({ 
     name: this.nameCtrl 
    }); 
    } 
} 

這可以解決你的問題。下面是更新Plunker

另請參見:


1 - 有一個良好的讀取見Host and Visibility...在這個題目

+0

感謝您的解決方法。我發現創建單個控件併爲每個控件保留一個屬性是相當乏味的,這就是爲什麼我正在尋找一個formControlName解決方案。我剛剛嘗試了'forms-builds'中的當前代碼,它顯示了相同的行爲,只是一個更詳細的錯誤消息:「formControlName必須與父formGroup指令一起使用,您需要添加formGroup指令並將其傳遞給現有FormGroup實例(您可以在您的課堂上創建一個實例)「。如果我將「formGroup」添加到我的指令,它似乎工作! – achimha

+0

因爲那麼'formGroup'指令是'fromControlName'的直接主機,當它執行主機查找時,允許'ControlContainer'被'FormControlName'發現。 –