Двустороннее связывание [(ngModel)]
— это синтаксический сахар Angular, который сочетает:
[ngModel]
) - данные из компонента в шаблон(ngModelChange)
) - данные из шаблона в компонентЭквивалентная запись:
<input [ngModel]="value" (ngModelChange)="value = $event">
Сокращенная запись:
<input [(ngModel)]="value">
import { FormsModule } from '@angular/forms';
@NgModule({
imports: [FormsModule]
})
ControlValueAccessor
:interface ControlValueAccessor {
writeValue(obj: any): void; // Компонент -> DOM
registerOnChange(fn: any): void; // DOM -> Компонент
registerOnTouched(fn: any): void;
}
writeValue()
onChange
Создание собственного элемента с двусторонним связыванием:
@Component({
selector: 'app-custom-input',
template: `
<input [value]="value" (input)="onInput($event)">
`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: CustomInputComponent,
multi: true
}]
})
export class CustomInputComponent implements ControlValueAccessor {
value: string;
onChange: (value: string) => void;
onTouched: () => void;
writeValue(value: string): void {
this.value = value;
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
onInput(event: Event) {
this.value = (event.target as HTMLInputElement).value;
this.onChange(this.value);
}
}
Использование:
<app-custom-input [(ngModel)]="data"></app-custom-input>
Change Detection:
OnPush
стратегииВалидация:
<input [(ngModel)]="email" required email>
[(ngModel)]
используется в шаблонных формахformControlName
Использование без FormsModule:
Конфликт имен:
@Input() ngModel
, будет конфликтПроизводительность:
debounceTime
или ручное управлениеПонимание механизма [(ngModel)] необходимо для: