рдХреЛрдгреАрдп рдореЗрдВ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЪрд▓реЛ рдХреЛрдгреАрдп рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдЦреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛, рдЙрдкрдпреЛрдЧ рдФрд░ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдЦ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдгреАрдп рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЧреЛрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╢реБрдн рдХрд╛рдордирд╛, рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░реЗрд░рд┐рдд рд░реВрдк


рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рдмреНрдж рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред рдПрдХ рдХреЛрдгреАрдп рдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ: рдЯреЗрдореНрдкрд▓реЗрдЯ рдбреНрд░рд┐рд╡реЗрди рдлреЙрд░реНрдо рдФрд░ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо ред

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбреНрд░рд┐рд╡реЗрди рдлреЙрд░реНрдо рджреЛ рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдлреЙрд░реНрдо рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ (hi, angularjs)ред рд╣рдо рдЙрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо), html рдореЗрдВ рдЙрд╕ рдЗрдирдкреБрдЯ рдЯреИрдЧ рдкрд░ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдВрдзрддреЗ рд╣реИрдВ [(рдорд╛рди)] = "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо", рдФрд░ рдЬрдм рдЗрдирдкреБрдЯ рдорд╛рди рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдорд╛рди рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред 2011 рдореЗрдВ, рдХрд┐ рд▓рд╛рдирдд рдЬрд╛рджреВ рдерд╛! рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЬрдЯрд┐рд▓ рдЖрдХрд╛рд░ рдмрдирд╛рдирд╛ ... рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИред рд╡реЗ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ, "рдлреЙрд░реНрдо рдХреНрд▓рд╛рд╕ ( рдлреЙрд░реНрдордЧреНрд░реБрдк ) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ, рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг ( рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ ) рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ html рдХреЛ рджреЗрдВ, рдФрд░ рдореИрдВ рдмрд╛рдХреА рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред" рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

class UsefullComponent { public control = new FormControl(''); public formG = new FormGroup({username: control}); } 

 <form [formGroup]="formG"> <input type="text" formControlName="username"> </form> 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рдорд┐рд▓рддрд╛ рд╣реИ, рд▓рд╛рдареА рдХреЗ рд╕рд╛рде рдФрд░ ... рдареАрдХ рд╣реИ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, formG.valueChanges рд╣рдореЗрдВ рдкреНрд░рдкрддреНрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди (рд╕реНрдЯреНрд░реАрдо) рджреЗрдЧрд╛ред рдЖрдк рдирдП рдирд┐рдпрдВрддреНрд░рдг рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ ( formG.value ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдФрд░ рдпрд╣ рд╕рдм formG рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдгреАрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╣рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлреЙрд░реНрдордмреНрдпреВрд▓рд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class UsefullComponent { public formG: FormGroup; constructor(private fb: FormBuilder) { this.formG = fb.group({ name: '' //  new FormControl() !! }) } } 

рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг


рдХреЛрдгреАрдп рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ "рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рджреЗрд╢реА рдирд┐рдпрдВрддреНрд░рдг (рдЗрдирдкреБрдЯ, рджрд┐рдирд╛рдВрдХ, рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрдиреНрдп) рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред" рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ-рдЪрд╛рд▓рд┐рдд рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рднреА, рдФрд░ рд╡реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдШрдЯрдХ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ (рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП), рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 import { Component, Input } from '@angular/core'; @Component({ selector: 'counter-control', template: ` <button (click)="down()">Down</button> {{ value }} <button (click)="up()">Up</button> ` }) class CounterControlComponent { @Input() value = 0; up() { this.value++; } down() { this.value - ; } } 

рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢ рдХреА рддрд░рд╣, рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рддрд╛рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рд╡реГрджреНрдзрд┐ рди рд╣реЛ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ)ред

рдЕрдм рд╣рдо рдмрдирд╛рдП рдЧрдП рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import { Component } from '@angular/core'; @Component({ selector: 'parent-component', template: ` <counter-control></counter-control> ` }) class ParentComponent {} 

рдпрд╣ рд╕рдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реВрдкреЛрдВ рдХрд╣рд╛рдБ рд╣реИрдВ! рдХрдо рд╕реЗ рдХрдо рдЯреЗрдореНрдкрд▓реЗрдЯ-рдЪрд╛рд▓рд┐рдд ...ред
рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ, рд╕рдм рдХреБрдЫ ControlValueAccessor рд╕реЗ рдорд┐рд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрдЧрд╛ред

рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп рдЕрднрд┐рдЧрдордХрд░реНрддрд╛


рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдгреАрдп рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ ControlValueAccessor рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдУрдУрдкреА рд╕реЗ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдПрдХ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрдм рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдг) рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ (рдХреЛрдгреАрдп рд░реВрдк) рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред

ControlValueAccessor рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдпреЛрдЧрд╡рд╢, рдХреЗрд╡рд▓ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реБрдб рдХреЗ рддрд╣рдд рдХреЛрдгреАрдп рднреА рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕ рд▓рд┐рдП? рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдорд╛рди рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрд╢реА рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦреЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдирдкреБрдЯ рдореЗрдВ, рдорд╛рди рдХреЛ рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ, рдорд╛рди рдХреЛ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЕрдкрдирд╛ ControlValueAccessor рд╣реЛрддрд╛ рд╣реИ: рдЗрдирдкреБрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯрд╛рд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП DefaultValueAccessor, рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП CheckboxControlValueAccessor, рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рдХреЗ рд▓рд┐рдП RadioControlValueAccessor , рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рд▓реЗрдХрд┐рди ControlValueAccessor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЛрдгреАрдп рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдореЙрдбрд▓ рд╕реЗ DOM (рджреГрд╢реНрдп) рддрдХ рдХрд╛ рдорд╛рди рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдлреЙрд░реНрдордЧреНрд░реБрдк рдФрд░ рдЕрдиреНрдп рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдирд╛ рдХреЛ рднреА рдмрдврд╝рд╛рддрд╛ рд╣реИред

рдЕрдм рдЬрдм рд╣рдордиреЗ ControlValueAccessor рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд▓рд┐рдпрд╛ рд╣реИ , рддреЛ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рджреЗрдЦреЗрдВ:

 interface ControlValueAccessor { writeValue(value: any): void registerOnChange(fn: any): void registerOnTouched(fn: any): void } 

writeValue (рдорд╛рди: рдХреЛрдИ рднреА) - рдЬрд┐рд╕реЗ рдЙрд╕ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕реНрд░реЛрдд ( рдирдпрд╛ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ ('рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реВрдВ) ) рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдКрдкрд░ рдПрдХ рдирдпрд╛ рдорд╛рди редрд╕реЗрдЯрд╡реИрд▓реНрдпреВ (' рдореИрдВ рд╕реЗрдЯрд▓ рд╣реЛ рдЪреБрдХрд╛ рд╣реВрдВ ') рд╕реЗрдЯ рд╣реИ ред

registerOnChange (fn: any) - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (fn рдПрдХ рдХреЙрд▓рдмреИрдХ рд╣реИ рдЬреЛ рдЙрд╕ рд░реВрдк рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ рд╣реИ)ред

registerOnTouched (fn: any) - рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмреНрд▓рд░ рдИрд╡реЗрдВрдЯ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╕реНрдкрд░реНрд╢ рд╕реЗ рдлрд╝реНрд▓реИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

 import { Component, Input } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; @Component({ selector: 'counter-control', template: ` <button (click)="down()">Down</button> {{ value }} <button (click)="up()">Up</button> ` }) class CounterControlComponent implements ControlValueAccessor { @Input() value = 0; onChange(_: any) {} up() { this.value++; } down() { this.value - ; } writeValue(value: any) { this.value = value; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched() {} } 


рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП onChange рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ (рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ) рдореЗрдВ рдПрдХ рдСрдирдЪреЗрдВрдЬ рдХреЙрд▓ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 // тАж class CounterControlComponent implements ControlValueAccessor { private _value; get value() { return this._value; } @Input() set value(val) { this._value = val; this.onChange(this._value); } onChange(_: any) {} up() { this.value++; } down() { this.value - ; } // тАж } 

рдлрд┐рд▓рд╣рд╛рд▓, рдХреЛрдгреАрдп рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ ControlValueAccessor рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдЗрдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд╕реЗ рдмрддрд╛рдПрдВ:

 import { Component, Input, forwardRef } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ тАж providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CounterControlComponent), multi: true }] }) class CounterControlComponent implements ControlValueAccessor { тАж } 

рдХреЛрдб рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдХреЛрдгреАрдп рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рдореИрдВ рдПрдХ рдирдпрд╛ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ( рдкреНрд░рджрд╛рди рдХрд░реЗрдВ: NG_VALUE_ACCESSOR ), рдореМрдЬреВрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдкреНрд░рд╛рд░рдВрдн рд╣реЛ рдЬрд╛рдПрдЧрд╛) рдШрдЯрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг ( рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЖрдЧреЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ: () => CounterControlComponent )" рдорд╛рди)ред ред

рдмрд╣реБ: рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рдЯреЛрдХрди ( NG_VALUE_ACCESSOR ) рдХреЗ рд╕рд╛рде рдХрдИ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рд╕рд┐рд░реНрдл рдмрдирд╛рдпрд╛ рдирд╣реАрдВ


рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг zayuzat рдХрд╛ рд╕рдордп рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдпрд╛рдд рдореЗрдВ FormsModule / ReactiveFormsModule рдХреЛ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЯреЗрдореНрдкрд▓реЗрдЯ рдЪрд╛рд▓рд┐рдд рдкреНрд░рдкрддреНрд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, ngModel рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЛ-рддрд░рдлрд╝рд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╣рдореЗрдВ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдПрдХ рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдорд┐рд▓рддрд╛ рд╣реИ:

 import { Component } from '@angular/core'; @Component({ selector: 'parent-component', template: ` <counter-control [(ngModel)]="controlValue"></counter-control> ` }) class ParentComponent { controlValue = 10; } 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, FormBuilder рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ , HTML рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ рдФрд░ рдЖрдирдВрдж рд▓реЗрдВ:

 import { Component, OnInit } from '@angular/core'; import { FormBuilder } from '@angular/forms'; @Component({ selector: 'parent-component', template: ` <form [formGroup]="form"> <counter-control formControlName="counter"></counter-control> </form> ` }) class ParentComponent implements OnInit { form: FormGroup; constructor(private fb: FormBuilder) {} ngOnInit() { this.form = this.fb.group({ counter: 5 }); } } 

рдЕрдм рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рд╣реИ, рдЬрдмрдХрд┐ рд╕рднреА рддрдВрддреНрд░ рджреЗрд╢реА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпрд╛ рдореИрдВрдиреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ?)ред рд╡рд░реНрддрдорд╛рди рд▓реЗрдЦ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рдордЧреНрд░реА:

рдкрд╛рд╕реНрдХрд▓ Precht рд╕реЗ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ ред
рдЧреЛрджреА рдХреЗ рд░реВрдк рдХреЛрдгреАрдп рдореЗрдВред
Rxjs рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ ред

Source: https://habr.com/ru/post/hi481424/


All Articles