當你在 FormGroup 或 FormArray 上呼叫 setValue,但傳入的值缺少某個已註冊控制項的項目時,就會發生這個錯誤。
setValue 的要求很嚴格——它要求每個控制項都有對應的值。如果你只想更新部分控制項,請改用 patchValue。
如何除錯
檢查錯誤訊息中指名的是哪個控制項,然後確認你的值物件有包含它。
這個錯誤有個常見來源,就是展開一個不具備所有鍵的物件:
const someValue = {first: 'Nancy'}; // 'last' is missing
form.setValue({...someValue}); // throws NG01002
當 someValue 來自 API 回應、部分狀態更新,或來自與表單結構不完全相符的型別時,就可能發生這種情況。這時請明確補上缺少的鍵,或改用 patchValue。
FormGroup
const form = new FormGroup({
first: new FormControl(''),
last: new FormControl(''),
});
// 'last' is not in the value — throws NG01002
form.setValue({first: 'Nancy'});
// both controls are covered — works fine
form.setValue({first: 'Nancy', last: 'Drew'});
FormArray
const formArray = new FormArray([new FormControl(''), new FormControl('')]);
// only one value for two controls — throws NG01002
formArray.setValue(['Nancy']);
// one value per control — works fine
formArray.setValue(['Nancy', 'Drew']);