2017-06-18 22 views
0

我正在查看NgModel的源代碼。我理解它的大部分內容,除了它是如何設置輸入的初始valueNgModel如何在內部工作(最初的設定值)

NgModel extends NgControl 

..

NgControl extends NgControlDirective 

..

NgControlDirective有這樣的代碼:

get value(): any { return this.control ? this.control.value : null; } 

所以,如果我們設置this.control.value它會自動設置爲的inputvalue。好。

但是this.control.setValue僅在更新NgModel時完成。

它是如何知道最初設定值的。

我猜測它的東西與

this.valueAccessor = selectValueAccessor(this, valueAccessors); 
+1

'但是this.control.setValue在NgModel.'第一次調用ngOnChanges上更新只是做會告知第一次更新。 – yurzui

+0

我也觀察到,看起來合法。SimpleChanges甚至有一個布爾值來告訴它的第一次更新。但不完全確定它是否正確 – Skeptor

+0

這是正確的,你能發表一個答案嗎? – Skeptor

回答

1

比方說,我們有以下模板

<input type="text" [ngModel]="x"> 

和組件類

x = 3; 

當指令是根據life cycles hooks documentationngOnChange初始化用調用掛鉤3

ngOnChanges(changes: SimpleChanges) { 
    this._checkForErrors(); 
    if (!this._registered) this._setUpControl(); 
    if ('isDisabled' in changes) { 
    this._updateDisabled(changes); 
    } 

    if (isPropertyUpdated(changes, this.viewModel)) { 
    this._updateValue(this.model); 
    this.viewModel = this.model; 
    } 
} 

previousValue由於等於undefinedthis._updateValue(this.model);方法將被調用。

private _updateValue(value: any): void { 
    resolvedPromise.then(
    () => { this.control.setValue(value, {emitViewToModelChange: false}); }); 
} 

其中this.control.setValue將被調用。

enter image description here