2017-02-24 97 views
6

在我的其中一個頁面上,我使用FormBuilder在初始化時填寫表單。每當輸入爲而不是爲空時,每個輸入都會得到一個類。這是通過將ngClass添加到每個輸入並訂購FormGroupvalueChanges來完成的。如何以編程方式觸發`valueChanges`?

每當通過編程填充表單時,就會出現我的問題。每當用戶更改表單上的任何值時,valueChanges被調用,但是,使用FormBuilder時情況並非如此。

我的問題是:如何在FormBuilder完成時獲取valueChanges事件。

我試過使用this.FormGroup.updateValueAndValidity(),但是這並沒有產生任何結果。

回答

3

我找到了一個適合我的解決方案。我忘記了updateValueAndValidity函數中的兩個參數。

  • onlySelf:只會更新此FormControl爲true。
  • emiteEvent:將導致valueChanges事件在正確時被觸發。

因此,作爲結果,你會得到這樣的: FormGroup.updateValueAndValidity({ onlySelf: false, emitEvent: true });

2

的標題和你的問題的描述是有些誤導。這是什麼? (i)

  • 是否要以編程方式更改字段的有效性狀態?
  • 或者,您是否想要確保您訂閱的字段valueChanges在以編程方式更改其值時被調用?

不管怎麼說,看看這個Plunkr:https://plnkr.co/edit/4V4PUFI1D15ZDWBfm2hb?p=preview

你會看到,當您以編程方式設置字段的值是這樣的:

this.myForm.get('myField').setValue(newValue); 

無論是有效性和valueChanges觀察到的字段被更新。因此,它看起來像你試圖重新創建一個已經存在的行爲。

然而,編程改變其值時,場的屬性dirty不更新(如per the doc:「A控制是髒如果用戶在UI改變了值」)。可能是因爲您正在檢查dirty屬性以指示現場錯誤,並且您有錯覺有效性狀態未更新,實際上它只是dirty屬性未更新?

(i)這兩件事情是不同的。您不應訂閱valueChanges手動觸發驗證。驗證應通過在表單模型中聲明驗證器來實施。

+0

我同意你的觀點,我的問題頗具誤導性,所以我花時間重寫了問題和答案。我曾嘗試'markAsDirty'的'setValue'選項,但是,這並沒有解決我的問題。 – Max

+1

謝謝Max。但是如果你[查看'setValue()']的源代碼(https://github.com/angular/angular/blob/master/modules/%40angular/forms/src/model.ts#L674)會發現它已經調用'updateValueAndValidity()'。此外,'emitEvent'參數默認設置爲'true'。換句話說,默認行爲應該已經給你所有你想要的東西。也許你沒有使用正確的語法來以編程方式更改字段的值? – AngularChef

+0

我公司的consisteny政策要求我使用FormBuilder來初始化表單的內容,所以我被要求使用FormBuilder。如果我只是使用'FormGroup.updateValueAndValidity()'而不提供參數,則表單不會使我需要的方式失效。但是,如果我提供參數,我確實得到了我需要的結果。 – Max

相關問題