有兩種選擇。第一個是使用綁定到表單的組件屬性,它需要手動更改檢測觸發。第二個是使用與輸入相關的表單控件,並且不需要手動更改檢測。
兩者都不是更好。
對於第一個選項,請參閱@ yurzui的答案。下面是第二個選擇答案 - 直接更新表單控件,而無需改變檢測:
function fillForm(){
let el = document.querySelector('input[ng-reflect-name="my_input"]');
let elProbe = ng.probe(el);
const NgControlClassReference = elProbe.providerTokens.find((p)=>{
return p.name === 'NgControl';
});
let directive = elProbe.injector.get(NgControlClassReference);
let control = directive.control;
control.setValue('some');
}
在這種情況下,你不需要改變檢測,因爲當你在控制調用setValue
它直接通知valueAccessor
有關變化:
FormControl.prototype.setValue = function (value, options) {
...
this._onChange.forEach(function (changeFn) {
return changeFn(_this._value, options.emitViewToModelChange !== false); });
其中changeFn
處於setUpContorl
功能添加訂戶:
control.registerOnChange((newValue: any, emitModelEvent: boolean) => {
// control -> view
dir.valueAccessor !.writeValue(newValue);
直接調用存取writeValue
,它反過來並將值寫入輸入:
export class DefaultValueAccessor implements ControlValueAccessor {
...
writeValue(value: any): void {
const normalizedValue = value == null ? '' : value;
this._renderer.setElementProperty(this._elementRef.nativeElement, 'value', normalizedValue);
}
您也可能會發現這篇文章有用
Everything you need to know about debugging Angular applications
你在哪裏打電話detectChanges? Angular非常懶惰,它想要一個踢:) – yurzui