[x] feature request
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рдг рдХреЗ valueChanges
Observable<any>
, рдЬреЛ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИрдВред
рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрдмрдВрдзрд┐рдд #11279
рдпрд╣ #11279 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рдХреГрдкрдпрд╛ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ?
рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд╛рдорд╛рдиреНрдп рдЕрдзрд┐рдХрд╛рд░ рд╣реЛ? рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ valueChanges рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ Observable<any>
рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #5404 рдкреВрдЫ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ #11279 . рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ
рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ AbstractControl рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдП рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рдордЭрд╛рдПрдВред
## get<Type>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреИрд╕рд╛ рдХрд┐ #11279 рдореЗрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬрд╛рд╡рд╛ рдЕрдирдмрд╛рдЙрдВрдбреЗрдб рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛, рддреЛ get
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛, рди рдХрд┐ any
ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html keyof
ред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.1 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдРрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдКрдкрд░ рдХреБрдЫ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ TS 2.2 (https://github.com/Microsoft/TypeScript/wiki/Roadmap#22-February-2017) рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ (https://github.com/Microsoft/TypeScript/ рдореБрджреНрджреЛрдВ/2175) рдПрдХ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо AbstractControl
рдХреЛ AbstractControl<T = any>
рддрд░рд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ T
рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ valueChanges
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдЬреЛ рдПрдХ Observable<T>
ред рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдкрд░ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЛ TS2.3 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рд╕рдВрд╕реНрдХрд░рдг 4.0 рдХреЗ рд╕рд╛рде рдХреЛрдгреАрдп рджреНрд╡рд╛рд░рд╛ рдЯреАрдПрд╕ 2.1 рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрд╕рдХреЗ рдмрд╛рдж рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдЯреАрдПрд╕ 2.3 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рдЬреЛ рдЕрдм рд╣реИ рдЬрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.3 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдБ рд╣реИ, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ рдЬрдм рдХреЛрдгреАрдп рдореЗрдВ TS 2.3 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛?
@desfero #16707 рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб рдХреЛ TS2.3 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдП
+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?
рд╡рд░реНрддрдорд╛рди рдореЗрдВ https://github.com/Microsoft/TypeScript/issues/16229 рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ
рдпрд╣ рдХрд╛рдо рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХреЛрдгреАрдп рдкреНрд░рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдкрддреНрд░
рдЗрд╕ рдкрд░ рдЫреЛрдЯрд╛ рдЕрдкрдбреЗрдЯ:
рдпрд╣рд╛рдБ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░: https://github.com/angular/angular/pull/16828#issuecomment -337034655
рд╡рд░реНрддрдорд╛рди рдкреНрд░рдкрддреНрд░ API рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рддреЛ рдпрд╛ рддреЛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рдХреА рдЬрд░реВрд░рдд рд╣реИ
рдпрд╛ рдПрдХ рдкреВрд░реНрдг рд░реВрдк рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛
рддреЛ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рдереАред
рдореИрдВ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдлреЙрд░реНрдо рдПрдкреАрдЖрдИ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ #20040
@Toxicable рдЬрд┐рд╕рдореЗрдВ рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред get('person') рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддреАрдХ рдХрд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг, @rpbeukes рд╕реЗ , рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯреЗрдб рддрд░реАрдХрд╛ рд╣реИред get(obj.person) рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред рдЗрд╕реЗ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдПрдЧреАред
@howiemp
get('person') рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ рдкреНрд░рддреАрдХ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
let g = new FormGroup({
'name': new FormControl('Toxicable'),
'age': new FormControl(22),
})
g.get('name') //AbstractControl<string>
g.get('age') //AbstractControl<number>
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ (obj.person) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЗрд╕рдореЗрдВ рдХрдИ рдлреЙрд░реНрдордЧреНрд░реБрдкреНрд╕ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред
рдЬрдмрдХрд┐ рдореЗрд░реА рд╡рд┐рдзрд┐ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИ, рдореЗрд░реЗ рдкреАрдЖрд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдпрд╛ рдХрд┐рд╕реА рдирдП рдПрдкреАрдЖрдИ (рдЬреЗрдиреЗрд░рд┐рдХ рд╕реЗ рдЕрд▓рдЧ) рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред
@Toxicable рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдмрджрд▓рд╛рд╡ рдХрд╛ рдорддрд▓рдм рдЪреАрдЬреЛрдВ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдирд╛ рд╣реИ, рди рдХрд┐ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ред рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд░реЗрдЯреНрд░реЛрдлрд┐рдЯреЗрдб) рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдХреЗ, рдпрджрд┐ рд╡рд╣ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдмреНрд░реЗрдХ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рд╕рднреА g.get('name') рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛, рддреЛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ 'рдирд╛рдо' рд╕реЗ 'рдлрд░реНрд╕реНрдЯрдирд╛рдо' рдореЗрдВ рдмрджрд▓рдирд╛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
class PersonDetails {
name: string;
age: number;
}
let g = new FormGroup<PersonDetails>({
name: new FormControl('Toxicable'),
age: new FormControl(22),
})
g.get(name) //AbstractControl<string>
g.get(age) //AbstractControl<number>
рд╡реЗ рд╕рднреА рдХрдбрд╝реЗ рд╕рдВрджрд░реНрдн рд╣реЛрдВрдЧреЗред рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд╕реЙрд▓реНрдпреВрд╢рди рдЗрд╕реЗ рдереЛрдбрд╝реЗ рд╣реИрдХреА рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
@ рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП
рдореИрдВ @howiempt рд╕реЗ рд╕рд╣рдордд
g.get(x => x.name) //AbstractControl
рджреЛрдмрд╛рд░рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЗ рдмрдбрд╝реЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдпрд╣ рдХрд┐рддрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИред
рдореБрдЭреЗ рдЖрдкрдХреА рд╕рдордЭ рдкрд░ рднрд░реЛрд╕рд╛ рд╣реИред
рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рд╕реЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛" рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдзреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХрджрдо рд╣реИред
рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП https://github.com/Quramy/ngx-typed-forms рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ
@Quramy рдореИрдВрдиреЗ рдХрдИ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереА рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ :(
+1ред рдЬрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рд╡реИрд╕рд╛ рд╣реАред
рдХреЛрдгреАрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдврд╛рдВрдЪреЗ рдХреЛ рдорд╛рдд рджреЗрддреА рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдФрд░ рдЪреМрдбрд╝рд╛ рдХрд░ рджреЗрдЧрд╛ :)
рдпрд╣ рд╕рд╢рд░реНрдд рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд░рд┐рдХрд░реНрд╕рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ..... рд╕рд╢рд░реНрдд рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд░ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ
рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (
@Quramy рд╕рдорд╛рдзрд╛рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ FormBuilder
рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рд╕рд╛рдорд╛рдиреНрдп FormGroup<T>
, FormControll<T>
рдФрд░ FormArray<T>
рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдРрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ AbtractControl<T>
рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред
рдПрдирдЬреАрдПрдХреНрд╕-рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдЕрдм рдПрдХ рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ
рдпрд╣ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рднреА рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдкреАрдЖрдИ @ рдХреЛрдгреАрдп/рд░реВрдкреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред
рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рд╡реИрдз рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред
+1 рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ..
рдпрдерд╛рд╢реАрдШреНрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдХреЛрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ
рдЗрд╕ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ (AGPL) рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ
https://github.com/concentricsky/badgr-ui/blob/master/src/app/common/util/typed-forms.ts
рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдХрд╛рдордХрд╛рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
рдЖрд╢рд╛ рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛
import { FormControl, AbstractControl } from "@angular/forms";
export class NumberControl extends FormControl{
_value: Number;
get value(){
return this._value;
}
set value(value){
this._value = Number(value);
}
}
рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░ рд╕реЛрдЪрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рдлреЙрд░реНрдордмрд┐рд▓реНрдбрд░ рд╕реНрддрд░ рдкрд░ рдмрд╕ рдПрдХ рдХрд╕реНрдЯрдо рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрдирд╛рдпрд╛ рд╣реИ:
import { Injectable } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
type ExtraProperties = { [key: string]: any } | null;
interface IModelConstructor { new(...args: any[]): any }
@Injectable({
providedIn: 'root'
})
export class TypedFormBuilder {
array = this.formBuilder.array;
control = this.formBuilder.control;
group = this.formBuilder.group;
constructor(private formBuilder: FormBuilder) {}
typedGroup<TGroupModel extends object>(ModelType: IModelConstructor, extraProps?: ExtraProperties): FormGroup & TGroupModel {
const formGroup: any = this.group({
...new ModelType(),
...extraProps
});
return new Proxy<FormGroup & TGroupModel>(formGroup, {
get: (target: FormGroup & TGroupModel, propName: string | number | symbol) => {
if (propName in target) {
return target[propName];
} else {
const property = target.get(propName as string);
return property && property.value;
}
},
set: (target: FormGroup & TGroupModel, propName: string | number | symbol, value: any, _: any) => {
if (propName in target) {
target[propName] = value;
} else {
target.setValue({ [propName]: value });
}
return true;
}
});
}
}
рдпрд╣ рд╕рдорд╛рдзрд╛рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдкрд░ рдкреЙрд▓рд┐рд╢ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдлреЙрд░реНрдордЧреНрд░реБрдк рдиреЗ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реЛ (рдЬреИрд╕реЗ рдХрд┐ myGroup.fields, рдЬрд╣рд╛рдВ "рдлрд╝реАрд▓реНрдб" рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛)ред рд▓реЗрдХрд┐рди рдпрд╣ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░рдпреЗрд╛рдЧ рдХреЗ рд▓рд┐рдП:
generateFormGroup() {
this.theGroup = builder.typedGroup<MyModel>(MyModel);
this.theGroup.someProperty = 5;
}
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдиреЗ рдлреЙрд░реНрдо рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ред рддреАрди рдбреЗрд╡рд▓рдкрд░ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдиреЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╕реНрддрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдкрд░ рд░рдЦрдирд╛ рд╕рд╣реА рдирд┐рд░реНрдгрдп рд╣реИред рд╕рднреА рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдФрд░ рдРрд╕реА рдЪреАрдЬреЗрдВ рдорд┐рд▓реАрдВ рдЬреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рдпрд╛ рдмреЛрдЭрд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдордп рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рдереА рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рдереАред
рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ AbstractControl#value
рд╕рд╛рде рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде DeepPartial<T>
рдпрд╛ AbstractControl#get
рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рд╕реЗ any
рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рднреА рдЦреЛ рдЬрд╛рддреА рд╣реИред
рд╢рд╛рдпрдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ?
рддреЛ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдкрд░ рдореИрдВрдиреЗ рдпрд╣реА рдХрд┐рдпрд╛ред
рдЕрд╕реНрд╡реАрдХрд░рдг ... рдореИрдВрдиреЗ рдЕрднреА рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рд╢реБрд░реБрдЖрдд рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ ... рдпрд╣рд╛рдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдлреЙрд░реНрдо рдЧреНрд░реБрдк рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдФрд░ рдЪреАрдЬреЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ...
import { FormGroup } from '@angular/forms';
export class FormGroupTyped<T> extends FormGroup {
public get value(): T {
return this.value;
}
}
рдФрд░ рдлрд┐рд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
import { FormGroupTyped } from 'path/to/your/form-group-typed.model';
interface IAuthForm {
email: string;
password: string;
}
const authForm: FormGroupTyped<IAuthForm> = fb.group({
email: ['', [Validators.required]],
password: ['', [Validators.required]],
});
const formValues: IAuthForm = this.authForm.value;
const email: string = formValues.email;
const invalidKeyVar: string = formValues.badBoy; // [ts] Property 'badBoy' does not exist on type 'IAuthForm'. [2339]
const invalidTypeVar: number = formValues.password; // [ts] Type 'string' is not assignable to type 'number'. [2322]
@Toxicable Lol рдЗрд╕ рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреЛрдЬ рд░рд╣рд╛ рдерд╛! рд╣рд╛рд╣рд╛
@cafesanu рдпрд╣рд╛рдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдордЧреНрд░реБрдк рдХрд╛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реИред
import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from '@angular/forms';
export class FormGroupTyped<T> extends FormGroup {
readonly value: T;
readonly valueChanges: Observable<T>;
constructor(controls: { [key in keyof T]: AbstractControl; },
validatorOrOpts?: ValidatorFn | Array<ValidatorFn> | AbstractControlOptions | null,
asyncValidator?: AsyncValidatorFn | Array<AsyncValidatorFn> | null) {
super(controls, validatorOrOpts, asyncValidator);
}
patchValue(value: Partial<T> | T, options?: {
onlySelf?: boolean;
emitEvent?: boolean;
}): void {
super.patchValue(value, options);
}
get(path: Array<Extract<keyof T, string>> | Extract<keyof T, string>): AbstractControl | never {
return super.get(path);
}
}
рдЙрдкрдпреЛрдЧ:
export class SearchModel {
criteria: string;
}
const searchForm = new FormGroupTyped<SearchModel >({
criteria: new FormControl('', Validators.required) // OK
badBoy: new FormControl('', Validators.required) // TS2345: Object┬аliteral┬аmay┬аonly┬аspecify┬аknown┬аproperties,┬аand┬а'badBoy'┬аdoes┬аnot┬аexist┬аin┬аtype┬а'{┬аcriteria:┬аAbstractControl;┬а}'.
});
рдореИрдВрдиреЗ FromControl рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЖрд╡рд░рдг рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: https://github.com/concentricsky/badgr-ui/blob/develop/src/app/common/util/ typed-forms.ts
рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реЙрд░реНрдо рдХрд╛ рдЖрдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдлрд╝реЙрд░реНрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
рдореИрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдгреАрдп рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред
рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
// Create a typed form whose type is dynamically constructed by the builder calls
const group = new TypedFormGroup()
.add("firstName", typedControl("", Validators.required))
.add("lastName", typedControl("", Validators.required))
.add(
"address",
typedGroup()
.add("street", typedControl("2557 Kincaid"))
.add("city", typedControl("Eugene"))
.add("zip", typedControl("97405"))
)
.addArray(
"items",
typedGroup()
.addControl("itemName", "")
.addControl("itemId", 0)
)
;
// All these are type checked:
group.value.address.street.trim();
group.controls.firstName.value;
group.untypedControls.firstName.value;
group.value.items[0].itemId;
рд╣рд╛рдп рд╕рдм рдкрд┐рдЫрд▓реЗ 3 рджрд┐рдиреЛрдВ рдореЗрдВ рдореИрдВ рдПрдХ d.ts gist
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди/рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
//BASIC TYPES DEFINED IN @angular/forms + rxjs/Observable
type FormGroup = import("@angular/forms").FormGroup;
type FormArray = import("@angular/forms").FormArray;
type FormControl = import("@angular/forms").FormControl;
type AbstractControl = import("@angular/forms").AbstractControl;
type Observable<T> = import("rxjs").Observable<T>;
type STATUS = "VALID" | "INVALID" | "PENDING" | "DISABLED"; //<- I don't know why Angular Team doesn't define it https://github.com/angular/angular/blob/7.2.7/packages/forms/src/model.ts#L15-L45)
type STATUSs = STATUS | string; //<- string is added only becouse Angular base class use string insted of union type https://github.com/angular/angular/blob/7.2.7/packages/forms/src/model.ts#L196)
//OVVERRIDE TYPES WITH STRICT TYPED INTERFACES + SOME TYPE TRICKS TO COMPOSE INTERFACE (https://github.com/Microsoft/TypeScript/issues/16936)
interface AbstractControlTyped<T> extends AbstractControl {
// BASE PROPS AND METHODS COMMON TO ALL FormControl/FormGroup/FormArray
readonly value: T;
valueChanges: Observable<T>;
readonly status: STATUSs;
statusChanges: Observable<STATUS>;
get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}
interface FormControlTyped<T> extends FormControl {
// COPIED FROM AbstractControlTyped<T> BECOUSE TS NOT SUPPORT MULPILE extends FormControl, AbstractControlTyped<T>
readonly value: T;
valueChanges: Observable<T>;
readonly status: STATUSs;
statusChanges: Observable<STATUS>;
get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}
interface FormGroupTyped<T> extends FormGroup {
// PROPS AND METHODS SPECIFIC OF FormGroup
//controls: { [P in keyof T | string]: AbstractControlTyped<P extends keyof T ? T[P] : any> };
controls: { [P in keyof T]: AbstractControlTyped<T[P]> };
registerControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): AbstractControlTyped<T[P]>;
registerControl<V = any>(name: string, control: AbstractControlTyped<V>): AbstractControlTyped<V>;
addControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): void;
addControl<V = any>(name: string, control: AbstractControlTyped<V>): void;
removeControl(name: keyof T): void;
removeControl(name: string): void;
setControl<P extends keyof T>(name: P, control: AbstractControlTyped<T[P]>): void;
setControl<V = any>(name: string, control: AbstractControlTyped<V>): void;
contains(name: keyof T): boolean;
contains(name: string): boolean;
get<P extends keyof T>(path: P): AbstractControlTyped<T[P]>;
getRawValue(): T & { [disabledProp in string | number]: any };
// COPIED FROM AbstractControlTyped<T> BECOUSE TS NOT SUPPORT MULPILE extends FormGroup, AbstractControlTyped<T>
readonly value: T;
valueChanges: Observable<T>;
readonly status: STATUSs;
statusChanges: Observable<STATUS>;
get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
setValue<V>(value: V extends T ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
patchValue<V>(value: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
reset<V>(value?: V extends Partial<T> ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}
interface FormArrayTyped<T> extends FormArray {
// PROPS AND METHODS SPECIFIC OF FormGroup
controls: AbstractControlTyped<T>[];
at(index: number): AbstractControlTyped<T>;
push<V = T>(ctrl: AbstractControlTyped<V>): void;
insert<V = T>(index: number, control: AbstractControlTyped<V>): void;
setControl<V = T>(index: number, control: AbstractControlTyped<V>): void;
getRawValue(): T[];
// COPIED FROM AbstractControlTyped<T[]> BECOUSE TS NOT SUPPORT MULPILE extends FormArray, AbastractControlTyped<T[]>
readonly value: T[];
valueChanges: Observable<T[]>;
readonly status: STATUSs;
statusChanges: Observable<STATUS>;
get<V = unknown>(path: Array<string | number> | string): AbstractControlTyped<V> | null;
setValue<V>(value: V extends T[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
patchValue<V>(value: V extends Partial<T>[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
reset<V>(value?: V extends Partial<T>[] ? V : never, options?: { onlySelf?: boolean; emitEvent?: boolean }): void;
}
рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг - рдХреГрдкрдпрд╛ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╡реАрдПрд╕рд╕реАрдУрдбреА рдореЗрдВ рдЪрд▓рд╛рдПрдВ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рдкрд░ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рдФрд░ рдкрдерд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╣реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВ ...
рдЗрд╕ рдЯреНрд╡рд┐рдЯрд░ рдереНрд░реЗрдб рдкрд░ рдореИрдВ рдХреБрдЫ "рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ" (V8+ рдХреЗ рдмрд╛рдж) рдХреЗ @IgorMinar рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛
рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА, рд╕реБрдЭрд╛рд╡ рдФрд░ рдорджрдж рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реИ !
рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди @ng-stack/forms
рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдкрддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИред
рддреЛ, рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
get userName() {
return this.formGroup.get('userName') as FormControl;
}
get addresses() {
return this.formGroup.get('addresses') as FormGroup;
}
рдЕрдм рдпрд╣ рдХрд░рдирд╛:
// Note here form model UserForm
formGroup: FormGroup<UserForm>;
get userName() {
return this.formGroup.get('userName');
}
get addresses() {
return this.formGroup.get('addresses');
}
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП @ng-stack/forms рджреЗрдЦреЗрдВ
рдЕрд░реЗ, рд╣рдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ 2 рдЪреАрдЬреЛрдВ рдкрд░ @zakhenry рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
рд╣рдо @dmorosinotto рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж
рдЕрдЧрд░ рдХреЛрдИ lib рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ: ngx-sub-form
рдирдорд╕реНрддреЗ @ maxime1992 рдореИрдВрдиреЗ Controls<T>
рд▓реЗрдХрд┐рди рдпрд╣ AbstractControl to <T[K]>
рд╕рдЦреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдХреНрдпрд╛ рдореИрдВ рдЖрдкрд╕реЗ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдБ рдХреНрдпреЛрдВ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ "рдЕрдирдЯрд╛рдЗрдкреНрдб" рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдФрд░ рд╢рд╛рдпрдж рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдХрдВрдЯреНрд░реЛрд▓ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░рдХрдВрдЯреНрд░реЛрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ?
рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ TypedForms.d.ts рдереЛрдбрд╝рд╛ рд╕рдЦреНрдд рд╣реИ рдФрд░ AbstractControlTyped to the type T<P>
"рдмрд▓" рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд▓рд╛рдЧреВ/рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдЬреЛ рдореВрд▓ ReactiveForms API рдореЗрдВ рдЕрдиреБрдордд рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЛрдИ рдЖ...
рдХреЛрдИ рд╕реЛрдЪ? рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓рд╛?
рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рдЯрд┐рдкреНрдкрдгреА рдореБрдЭреЗ рдпрд╣ рддрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдмрдирд╛рдИ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕ рдкреАрдЖрд░ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕реЗ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдП ...
рдзрдиреНрдпрд╡рд╛рдж
рдкреАрдПрд╕: рдПрдирдЬреАрдПрдХреНрд╕-рд╕рдм-рдлреЙрд░реНрдо рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╕рдмрдлреЙрд░реНрдо рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП ControlValueAccessor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рднреА рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛
@ рдПрдирдЬреА-рд╕реНрдЯреИрдХ/рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕рдорд░реНрдерди рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рддреНрдпрд╛рдкрдиред
рдХрдХреНрд╖рд╛рдПрдВ FormControl
, FormGroup
, FormArray
рдФрд░ FormBuilder
рд╕рднреА рддрд░реАрдХреЗ
рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ "рддреНрд░реБрдЯрд┐ рд╕рддреНрдпрд╛рдкрди рдореЙрдбрд▓" рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ:
class ValidationModel {
someErrorCode: { returnedValue: 123 };
}
const control = new FormControl<string, ValidationModel>('some value');
control.getError('someErrorCode'); // OK
control.errors.someErrorCode; // OK
control.getError('notExistingErrorCode'); // Error: Argument of type '"notExistingErrorCode"' is not...
control.errors.notExistingErrorCode; // Error: Property 'notExistingErrorCode' does not exist...
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ValidatorsModel
рдирд╛рдордХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
const control = new FormControl('some value');
control.getError('required'); // OK
control.getError('email'); // OK
control.errors.required // OK
control.errors.email // OK
control.getError('notExistingErrorCode'); // Error: Argument of type '"notExistingErrorCode"' is not...
control.errors.notExistingErrorCode // Error: Property 'notExistingErrorCode' does not exist...
ValidatorsModel
рдореЗрдВ typeof Validators
рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
class ValidatorsModel {
min: { min: { min: number; actual: number } };
max: { max: { max: number; actual: number } };
required: { required: true };
requiredTrue: { required: true };
email: { email: true };
minLength: { minlength: { requiredLength: number; actualLength: number } };
maxLength: { requiredLength: number; actualLength: number };
pattern: { requiredPattern: string; actualValue: string };
}
@dmorosinotto рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдБ
Validators.compose([Validators.required, Validators.maxLength(20), Validators.minLength(3)])
рд╣рд╛рдп @youssefsharif рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? .d.ts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐/рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛?
рдпрджрд┐ рдЖрдк рдПрдХ рдирдореВрдирд╛ рдХреЛрдб рдпрд╛ рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд▓реВрдВрдЧрд╛ рдФрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рддреЛ рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛
@ng-stack/forms
рд▓рд┐рдП input[type="file"]
рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд
рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рдкрд░ рднреА
рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FormData
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде "рдХреНрд▓рд╛рд╕рд┐рдХ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрдИ рд▓рд╛рдн рд╣реИрдВ:
<input type="file" name="someName">
-> formControl.value
someName
рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЗ рд╕рд╛рде;multiple
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ (рдпрд╣рд╛рдВ userpic[]
рдиреЛрдЯ рдХрд░реЗрдВ)<input type="file" multiple name="userpic" [formControl]="formControl">
```ts
formData.append('userpic[]', myFileInput.files[0]);
formData.append('userpic[]', myFileInput.files[1]);
- `Validators` have four static methods for files
```ts
import { Validators } from '@ng-stack/forms';
Validators.fileRequired;
Validators.fileMaxSize(1024);
Validators.filesMaxLength(10);
Validators.filesMinLength(2);
@KostyaTretyak рдореИрдВрдиреЗ рдЕрдм рддрдХ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣
рд╣рдо рд▓рдЧрднрдЧ рдХреЛрдгреАрдп 8 рдореЗрдВ рд╣реИрдВ рдФрд░ рдЕрднреА рднреА 100% рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдИ рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред
@kroeder , рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджрд╛ рджреЛ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╣рд▓реЗ (рд▓рдЧрднрдЧ рдХреЛрдгреАрдп 2 рдХреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж) рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз 1.5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдмрд┐рдирд╛ рдорд░реНрдЬ рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ...
рд▓реЗрдХрд┐рди рдЕрдЧрд░ @ng-stack/forms
рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рдХреЛрдгреАрдп 8+ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдЙрдВрдЧрд╛ред
@KostyaTretyak рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ :) рдореИрдВ https://github.com/no0x9d/ngx-strongly-typed-forms рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ @no0x9d рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА
@ZNS , рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рд▓реЗрдХрд┐рди рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ngx-strongly-typed-forms
рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдлрд╝реЙрд░реНрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
@ZNS @KostyaTretyak рдирдорд╕реНрддреЗред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ ngx-рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░реВрдкреЛрдВ рдХрд╛ рд▓реЗрдЦрдХ
рдореИрдВрдиреЗ @ng-stack/forms
рдХреЗ рдлреАрдЪрд░ рд╕реЗрдЯ рдХреА рддреНрд╡рд░рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХреА рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реИрдВред
рд▓рдЧрднрдЧ рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдФрд░ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмреАрдЪ рдПрдХ рд╡реИрдЪрд╛рд░рд┐рдХ рдЕрдВрддрд░ рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореВрд▓ рдХреЛрдгреАрдп рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХреЛ рдХреБрдЫ рдкреНрд░реЙрдХреНрд╕реА рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдпрд╛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореВрд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдирдЧрдгреНрдп рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рдкрд░рдд рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрдЧ рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕реНрдерд┐рд░ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд░рди рдЯрд╛рдЗрдо рдкрд╛рд░реНрдЯ NgModule рд╣реИ рдЬреЛ рдореЗрд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлреЙрд░реНрдордмрд┐рд▓реНрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓ рдХреЛрдгреАрдп рдлреЙрд░реНрдордмрд┐рд▓реНрдбрд░ рд╣реИред рдмрд╛рдХреА рд╕рдм рд╕рд┐рд░реНрдл рдХреЛрдгреАрдп рдХреЛрдб рд╣реИред
рдкреНрд░рддреНрдпрдХреНрд╖ рддреБрд▓рдирд╛ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ ValidationModel рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ FormGroups рдФрд░ Arrays рд╕реЗ FormArrays рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рддрд░реНрдХ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AbstractControl#get
рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИред
рдХреБрдЫ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдХреЛрдб рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рди рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд╕реЗрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рджреВрд╕рд░реА рддрд░рдл рдореБрдЭреЗ рдЙрди рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдПрдкреАрдЖрдИ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдЬреЛ рд╕рдЦреНрддреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред
+1 рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?
рдХреЛрдгреАрдп рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЯрдХреНрдХрд░?
рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдмреИрдХрд▓реЙрдЧ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рд╛рдареА рдФрд░ рднрдпрд╛рдирдХ-5%-рдХрдореА-рдмрдВрдбрд▓-рдЖрдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
@ рд▓реЛрдирд▓реА-рд▓реЛрдХрд▓реА
рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред
рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЕрдиреНрдп рджреЗрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ?
рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрд╕реЗ рдХреЛрдИ рдкреАрдЖрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рди рд╣реА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдлрд╕реА рджреЗрдЦрд╛ :man_shrugging:
рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдмреИрдХрд▓реЙрдЧ рд╣реИ
рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ :рднрдпрднреАрдд :!
рд▓реЛрдЧ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдХрдВрдкрдиреА _[рдЙрдиреНрд╣реЗрдВ рднреБрдЧрддрд╛рди рдХрд░ рд░рд╣реА рд╣реИ]_ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?
рдХрд┐рддрдиреА рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ!
рднрдпрд╛рдирдХ-5%-рдХрдореА-рдмрдВрдбрд▓-рдЖрдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред
рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдЗрд╡реА рдФрд░ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ) рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЖрдЗрд╡реА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рдкрд░рд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ! :рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛:
рд╣рд╛рдВ, рдпрд╣ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдЗрд╡реА рдмрдВрдбрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЯреВрд▓ рдХреЛ рдРрдкреНрд╕ рдкрд░ рдмреЗрд╣рддрд░ рдЯреНрд░реА рд╢реЗрдХрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдФрд░ рдЙрдореНрдореАрдж рд╣реИ, рд╡рд╣ рдЖрдПрдЧрд╛! рдЕрднреА рдХреЗ рд▓рд┐рдП рд╡реЗ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рднреА рддреЛрдбрд╝ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдмреЗрд╣рддрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдореЙрдбреНрдпреВрд▓ рдЖрдзрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдШрдЯрдХ рдЖрдзрд╛рд░ рдкрд░ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди, рдФрд░ рдкреЗрдбрд╝ рд╣рд┐рд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕ рдкреЗрдбрд╝ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓реАрдВрдЧ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧреАред
рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рд╕рдореНрдорд╛рдирдЬрдирдХ рдмрдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЯреНрд░реИрд╢ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдореБрдлреНрдд рдореЗрдВ рдУрдкрди рд╕реЛрд░реНрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдЪреАрдЬреЗрдВ рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рдмрд╣реБрдд рдмрдбрд╝рд╛ рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдореБрджреНрджреЗ рдкреАрдЫреЗ рдЫреВрдЯ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХреА рдЬрд░реВрд░рдд рдереА рдФрд░ рдХрд┐рд╕реА рдЪреАрдЬ рдХреЛ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рдЕрдЪреНрдЫрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣ рдмрд╕ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╣реЛрдирд╛ рдерд╛ред
рдЕрдм рдореИрдВ рдЗрд╕ рдмрд╣рд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЧреИрд░-рдЙрддреНрдкрд╛рджрдХ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдПрдХрд╛рдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред *рдЙрдбрд╝ рдЬрд╛рдирд╛*
@ рдореИрдХреНрд╕рд┐рдореЗ-рдПрд▓реЗрдХреНрд╕
рдХрдИ рдЕрдиреНрдп рдкреАрдЖрд░ рд╣реИрдВ (рдЕрднреА рддрдХ 386), рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдХреБрдЫ рдмрджрд▓реЗрдЧрд╛?
рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдмрд╛рдд рдХрд░реЗрдВ рддреЛ, рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдкреАрдЖрд░ (https://github.com/angular/angular/pull/20040) рдЕрднреА рднреА рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдмрд╛рдд рдХрд░реЗрдВ рддреЛ рдЖрдЗрд╡реА рдХрд╛ рдЬрд┐рдХреНрд░ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рддрдиреЗ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
https://github.com/angular/angular/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc
рдореБрдЭреЗ рдЕрдм рднреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдВрдЧреБрд▓рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ, рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдФрд░ рд╕рдореБрджрд╛рдп рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рдЕрдзрд┐рдХ рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдпрд╣реА рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдпрд╣рд╛рдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВред
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЕрд▓рдЧ рд╕реЗ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдИ рдмрдХрд╛рдпрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯрд┐рд╡рдлреЙрд░реНрдо рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдП рдЧрдП рдХреБрдЫ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдмрдЬрд╛рдп asyncValidator
)ред рдЖрдк #31963 рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ , рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ред рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ @ng-stack/forms
рдлреАрдЪрд░ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (рдмрд┐рдирд╛: рд╕рддреНрдпрд╛рдкрди, рдСрдЯреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдлреЙрд░реНрдо рдХрдВрдЯреНрд░реЛрд▓ рдФрд░ рд╕рдкреЛрд░реНрдЯ рдЗрдирдкреБрдЯ [рдлрд╛рдЗрд▓])ред
рдЕрд░реЗ, рдореИрдВ рдПрдВрдЧреБрд▓рд░ рдЯреАрдо рд╕реЗ рдПрдХ рдЕрдкрдбреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: рд╣рдо рдЖрдкрдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИред рд╣рдо рдЬрд▓реНрдж рд╣реА рдЕрдзрд┐рдХ рдордЬрдмреВрддреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЛрдВ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрдирд╛ рдФрд░ рдЖрдкрдХреА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдлрд┐рд░ рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!
рдУрд╣!!!!! рдирд┐рдХрд▓ рд░рд╣рд╛ рд╣реИ!
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ, рдПрдВрдЧреБрд▓рд░ рдЯреАрдо, рдереИрдВрдХреНрд╕!
рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреА, рдореИрдВ angular-typesafe-reactive-forms-helper рдХреЛ рд╣рдЯрд╛
рд╣рд╛рдБ!!!!
рдореИрдВ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдБ!! рдзрдиреНрдпрд╡рд╛рдж, рдХреЛрдгреАрдп рдЯреАрдо !!
рдХреНрдпрд╛ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдкреИрдо рдХреЗ рд╕рд╛рде рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ?
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдореЛрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВ - рдзрдиреНрдпрд╡рд╛рджред
рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдЧреБрд▓рд░ рдЯреАрдо рдиреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдЪрд┐рдХрдиреА рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдк рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП infer
рдкреНрд░рдХрд╛рд░ рдХрд╛
рдЬрдм рдореИрдВрдиреЗ рдлреЙрд░реНрдордЧреНрд░реБрдк рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛T
рд░реВрдк рдореЗрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╕рд░рд▓ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
FormGroup<{ id: string, username: string | null }>
рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЬрдм рдореБрдЭреЗ рдЬрдЯрд┐рд▓ рдЯреЗрдмрд▓ рдлреЙрд░реНрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдВрдЧреБрд▓рд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реЗрдл рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред
type User = { id: string, username: string | null }
const table: FormArray<User> = new FormArray([{ id: '0', username: 'gaplo917'}])
const row: FormGroup<User> = table.at(0) as FormGroup<User> // you must do a type cast
// NO way to get type-safe binding in Angular HTML
<input [formControl]="table.at(i).controls.id" />
рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдердХрд╛рдК рдФрд░ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИред рдЖрдИрдПрдордПрдЪрдУ, рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдкреВрд░реА рддрд░рд╣ рдЦреЛ рджреЗрддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ KeyValueControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рд╣реВрдВT
рдФрд░ KeyValueControl рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП infer
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
export type KeyValueControl<V> = {
[key in keyof V]: V[key] & AbstractControl
}
export type InferTypedForm<Type> = Type extends TypedFormControl<infer X>
? X
: Type extends Array<TypedFormControl<infer X1>>
? X1[]
: Type extends Array<TypedFormGroup<infer X2>>
? Array<InferTypedFormGroup<X2>>
: Type extends TypedFormGroup<infer X3>
? InferTypedFormGroup<X3>
: Type extends TypedFormArray<infer X4>
? Array<InferTypedForm<X4>>
: never
export type InferTypedFormGroup<T> = { [key in keyof T]: InferTypedForm<T[key]> }
export type InferTypedFormArray<T> = InferTypedForm<T[]>
export class TypedFormGroup<T extends KeyValueControl<T>> extends FormGroup {
readonly controls: T
readonly valueChanges: Observable<InferTypedFormGroup<T>>
readonly statusChanges: Observable<FormStatus>
readonly value: InferTypedFormGroup<T>
...
}
рдирддреАрдЬрддрди,
interface Foo {
first: TypedFormControl<string | null>
last: TypedFormControl<string | null>
}
const table: FormArray<FormGroup<Foo>>
const row: FormGroup<Foo> = table.at(0) // typescript compile OK!
// type-safe binding in Angular HTML, all auto-complete (`id`, `username`) finally works!
<input [formControl]="table.at(0).controls.id" />
рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рд░реВрдкреЛрдВ рдореЗрдВ рдПрдХ рд╕рдЪреНрдЪрд╛ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдЕрдиреБрднрд╡ рд╣реИред
рдореМрдЬреВрджрд╛ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП 100% рд╕рдВрдЧрдд
https://github.com/gaplo917/angular-typed-forms
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдзрд╛рд░реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдЧрд╛рдореА рд╕рд╢рдХреНрдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдЯреЗрдмрд▓ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕рдм-рдлреЙрд░реНрдо рдЬреИрд╕реЗ рдЬрдЯрд┐рд▓ рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
@IgorMinar , рдХреЛрдгреАрдп рдХреЛрд░ рдЯреАрдо , рдФрд░ рдХреЛрдгреАрдп рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдп ред
рдпрд╣ рд▓рдВрдмреА рдЯрд┐рдкреНрдкрдгреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЬреЛ рдЯрд┐рдХрдЯ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ " рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл " рдФрд░ " рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП " рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрдЬрд╛рдп рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдХрдХреНрд╖рд╛-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЙрд╕ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ ng-stacks/forms рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдПрдВрдЧреБрд▓рд░ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдХреЗ рдХреЛрдб рдмреЗрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдореБрдЭреЗ рдХреМрди рд╕реА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЪреБрдиреМрддрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ рдФрд░ рдХрдХреНрд╖рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреНрд░реЙрдиреНрдЧрд▓реА рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдХреНрд▓рд╛рд╕-рдмреЗрд╕реНрдб рдПрдкреНрд░реЛрдЪ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рдХреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рдУрдУрдкреА рдкреНрд░рдерд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡рд░реНрдЧ рд╣рдореЗрдВ рдХреЛрдб рдХреА рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рд▓рд╛рдн рдЬреЛ рдореИрдВ рдиреАрдЪреЗ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдБ:
*ngIf
рдбрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВредрдореБрдЭреЗ рдЙрдкрд░реНрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЛ Class
рдореЗрдВ рдмрджрд▓рдиреЗ рджреЗрдВ рдФрд░ Class
рдЧреБрдгреЛрдВ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рд╣рдо рдПрдХрд▓ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡ рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди тАЛтАЛрдХрд░ рд░рд╣реЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
рдЖрдЗрдП рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХреНрд▓рд╛рд╕ рдбреНрд░рд┐рд╡реЗрди рд╕реНрдЯреНрд░реЙрдиреНрдЧрд▓реА-рдЯрд╛рдЗрдкреНрдб рдПрдкреНрд░реЛрдЪ рд╕реЗ рдХрд░реЗрдВ рдЬреЛ рд╣рдореЗрдВ рдЙрди рджреЛрдиреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
1. рдПрдХ рдлреЙрд░реНрдордЧреНрд░реБрдк рдмрдирд╛рдПрдВ
рдпрд╣рд╛рдБ рд╣рдо рдХрд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ FormBuilder
рдФрд░ рдХреА рдПрдХ рд╣реА рд╡рд┐рдзрд┐ group
ред рд▓реЗрдХрд┐рди рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдЕрд▓рдЧ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ ReactiveTypedFormsModule
рдмрдЬрд╛рдп ReactiveFormsModule
ред рдЖрдЗрдП рдПрдХ FormGroup
рдмрдирд╛рдПрдВ:
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рд╢реНрди рдЖрддрд╛ рд╣реИ,
рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг
ReactiveTypedFormsModule
рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХрд░реЗрдЧрд╛?
рд╣рд╛рдВ, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛,ReactiveTypedFormsModule
рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред
2. рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓реЗрдВ
setValue
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╕реАрдзреЗ Class
рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ FormControl
рдорд╛рди рд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред
3. рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХреЗ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп ValueChanges
, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ setter
рд╡рд┐рдзрд┐ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
4. рдЗрдирдкреБрдЯ рд╡реИрд▓реНрдпреВ рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВ
рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдЗрдирдкреБрдЯ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬреИрд╕реЗ рддрд╛рд░реАрдЦ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ String
рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЯреАрдПрд╕ рдХреЛрдб рдореЗрдВ Date
рдкреНрд░рд╛рд░реВрдк рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдореВрд▓реНрдп рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдирд╣реАрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдирд╛рдбрд╝реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛рдирд╛ рд╣реИ рдФрд░ рдмреНрд▓рд╛ рдмреНрд▓рд╛ рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рд╣реИ ... , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдХрдХреНрд╖рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛрдб рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
@toDate() // this will convert the value before assigning the value in 'dob' property.
dob:Date;
4. рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓реЗрдВ
рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕реАрдзреЗ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ SetValue
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
5. рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЕрд░реЗ рдореЗрдВ рдлреЙрд░реНрдордЧреНрд░реБрдк рдЬреЛрдбрд╝рдирд╛
рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдирд╣реАрдВ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб ЁЯШД рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рд╕рд░рд▓ рдХреЛрдб . HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рднреА рдЕрдзрд┐рдХ рдорд┐рд▓реЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ
<form [formGroup]="user.formGroup">
<input type="text" formControlName="firstName"/>
<small >{{user.formGroup.controls.firstName.errorMessage}}</small>
<!--Nested FormGroup-->
<div [formGroup]="user.address.formGroup">...</div>
<!--Nested FormArray - Skills-->
<div *ngFor="let skill of user.skills">
<div [formGroup]="skill.formGroup">...</div>
</div
</form>
рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ рд▓рд┐рдВрдХ : рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рд╡рд░реНрдХрд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рдЬреЛрд░рджрд╛рд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
рдЬреАрдердм рдкрд░ рдЙрджрд╛рд╣рд░рдг : рдЬреЛрд░рджрд╛рд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдкрддреНрд░
@ajyojha , рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ
setValue()
рдФрд░ valueChanges()
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?рдореИрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реВрдВ:
setValue()
рдЕрд▓рд╛рд╡рд╛ patchValue()
, reset()
рднреА рд╣реИрдВ, рдЬреЛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ setValue()
рдХреЛ рдПрдХ рд╕реЗрдЯрд░ рд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдб рдЕрд╕рдВрдЧрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреЙрд░реНрдо рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧреЗрдЯрд░реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рднреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдкрддреНрд░ рдореЙрдбрд▓ рдЧреБрдг рдирд╛рдо рдорд┐рд▓рд╛рдирд╛ рднреА рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИредрдзрдиреНрдпрд╡рд╛рдж, @KostyaTretyak рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ :)ред
- рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдУрд╡рд░рд╣реЗрдб рдЦрд░рд╛рдм рд╣реИред
рдХреЗрд╡рд▓ рдЖрдкрдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдордЧреНрд░реБрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЬреЛрд░рджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╣рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдЦрд░рд╛рдм рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд╣реАрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдЦрд░рд╛рдм рд╣реИрдВред рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЪрд┐рдВрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдЦрддреНрдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореЗрд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрд▓рд╛рд╕ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрдХреНрд╖рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрд░реА рд╕рдордЭ рд╣реИ, рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд╛рдн рд╕реЗ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдкрдардиреАрдпрддрд╛, рдорд╛рдкрдиреАрдпрддрд╛ рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рдорд┐рд▓рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣рдо рд╕рд╢рдХреНрдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдкрддреНрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╣реА рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдгрди рдХрд░рдиреЗ рджреЗрдВ, рдЬреЛрд░рджрд╛рд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ (рдореЗрд░реЗ рдЕрдиреБрд╕рд╛рд░) рд╣реИред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдЬрдЧрд╣ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдореЗрд░реА рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреА рдЧрдИ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рдЕрдкрдирд╛ рдорд╛рдорд▓рд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рджреЗрдВ, рдореЗрд░реЗ рдПрдХ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ 6k+ рд╕реЗ рдЕрдзрд┐рдХ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рд╡рд┐рдХрд╛рд╕ рджрд▓ рдореБрдЭрд╕реЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЪреНрдЫреЗ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдЧрд╛:
рдЕрдм рдмрд╕ рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓реЛрдВ рдкрд░ рдПрдХ рдмрдбрд╝реЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдСрди рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдореНрд╕ рдХреЗ рд╕рд╛рде рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рд░ рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред
- рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореИрдВ " рдЗрдЯреНрд╕ рдЧреБрдб " рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рд╕реЗ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдПрдкреНрд░реЛрдЪ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЛ рдЙрдирдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдгреЛрдВ рдХрд╛ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
- рдпрджрд┐ рд╕реЗрдЯрд░реНрд╕ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ setValue() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ 'рд╕реЗрдЯрд╡реИрд▓реНрдпреВ ()' рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдХрдХреНрд╖рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред
- рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рд╕реНрдерд┐рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рд╕реНрдерд┐рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЫреВрдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдм рддрдХ рдХрдорд┐рдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдХрд┐ рддрд░реНрдХ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдо 'рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдХреЛрдИ'?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЫреБрдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдФрд░ рдХрд▓реНрдкрдирд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд▓рд╛рдн рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред
- рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди - рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╣рдордд рд╣реИрдВред
рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рдЗрд╕ рдкрд░ рдПрдХ рд╣реА рдкреГрд╖реНрда рд╣реИрдВ :)ред
- рд╕реЗрдЯрд╡реИрд▓реНрдпреВ () рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреИрдЪрд╡реИрд▓реНрдпреВ (), рд░реАрд╕реЗрдЯ () рднреА рд╣реИрдВ, рдЬреЛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ setValue() рдХреЛ рдПрдХ рд╕реЗрдЯрд░ рд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдб рдЕрд╕рдВрдЧрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреЙрд░реНрдо рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рднреА рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдкрддреНрд░ рдореЙрдбрд▓ рдЧреБрдг рдирд╛рдо рдорд┐рд▓рд╛рдирд╛ рднреА рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдореБрдЭреЗ рдЙрдкрд░реЛрдХреНрдд рдмрд┐рдВрджреБ рдХреЛ рддреАрди рдЦрдВрдбреЛрдВ рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐, рд╕реЗрдЯрд░ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб, рдФрд░ рдорд┐рд╢реНрд░рдг рдлреЙрд░реНрдо рдореЙрдбрд▓ рдЧреБрдгреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рджреЗрдВред
рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛: рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ 'рдкреИрдЪрд╡реИрд▓реНрдпреВ' рдпрд╛ 'рд░реАрд╕реЗрдЯ' рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдкреИрдЪрд╡реИрд▓реНрдпреВ рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп 'рд╕реЗрдЯрд╡реИрд▓реНрдпреВ' рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ (рдпрд╣ рдХреЛрдгреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рд╕реЗрдЯрд╡реИрд▓реНрдпреВ рдмрдирд╛рдо рдкреИрдЪрд╡реИрд▓реНрдпреВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд╣реИ)ред рдореЗрд░рд╛ рдзреНрдпрд╛рди рдХреЗрд╡рд▓ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╣рдо рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред
рд╕реЗрдЯрд░ рдкреНрд░рджрд░реНрд╢рди : рдореИрдВ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рдмрдпрд╛рди рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдк рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдгреАрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдВрдЯреНрд░реЛрд▓ рд╡реИрд▓реНрдпреВ рдПрдХреНрд╕реЗрд╕рд░ рдХреНрд▓рд╛рд╕ рдФрд░ рдХрдИ рдЕрдиреНрдп рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдмрдирд╛рддрд╛ рд╣реИ рдХрдХреНрд╖рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдПрдХ рдФрд░ рдмрд╛рдд рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдо @Input рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрдИ рдШрдЯрдХреЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдпрд╛ рдХреЛрдгреАрдп рдЯреАрдо рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИред рдЕрдм рдкреНрд░рджрд░реНрд╢рди рдХреА рдЪрд┐рдВрддрд╛ рдкрд░ рдЖ рд░рд╣реЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдореМрдЬреВрджрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ (рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдЪреБрди рд╕рдХрддреА рд╣реИ рдпрджрд┐ рд╡реЗ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ ChangeDetectionStrategy рдХреА рддрд░рд╣ рд╣реА рдЪрд╛рд╣реЗрдВред рдХреГрдкрдпрд╛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП rxweb рдкреНрд░рд▓реЗрдЦрди рд╕рд╛рдЗрдЯ рдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдпрд╣ рдорд╛рдорд▓рд╛ред рдЬрдЬ рдХрд░реЗрдВ рдХрд┐ рдЬрдм рд╣рдо рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдХрд┐рддрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рд╕реАрдзреЗ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдХрдо рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди, рдХрдо рдЖрдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИ рдкреИрдХреЗрдЬ, рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдФрд░ рдХрдИ рдЕрдиреНрдп рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВред
рдЧреБрдгреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг : рддреЛ рдЖрдкрдХреА рдХреНрдпрд╛ рд░рд╛рдп рд╣реИ, рдХреНрдпрд╛ рдЖрдк рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рднрд┐рдиреНрди рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рд╕рдВрдкрддреНрддрд┐ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдЕрдЪреНрдЫреА рд░рд╛рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдФрд╕рдд 40+ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдФрд░ рдЙрддреНрдкрд╛рдж рдирд┐рд░реНрдорд╛рдг рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╢реЗрдХ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдореЗрдВ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреЗрд╣рддрд░ рд░рд╛рдп рд╣реИ?
рдЕрдм рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрддреЗ рд╣реИрдВ, рд╣рдо рджреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВред рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдЧреБрдг рдЕрд▓рдЧ рд╣реИрдВ рдФрд░ рд╡рд░реНрдЧ рдЧреБрдг рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдЖрд░рдПрдХреНрд╕рд╡реЗрдм рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдкреИрдХреЗрдЬ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХреА рднрд╛рд╡рдирд╛ (рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдирд╛рдо рдХреЛ рдлреЙрд░реНрдо-рдХрдВрдЯреНрд░реЛрд▓ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░) рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ :)ред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рдерд╛рдУрдВ рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдЪреАрдЬреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ @rxweb/types рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдПрдВрдб-рдЯреВ-рдПрдВрдб рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рд╕реЙрд▓реНрдпреВрд╢рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдХреНрд╖рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)ред
рд╕реНрдЯреИрдХрдмреНрд▓рд┐рдЯреНрдЬ: рдУрдкрди
рдЬреАрдердм : рдЗрдВрдЯрд░рдлреЗрд╕ рдбреНрд░рд┐рд╡реЗрди рд╕реНрдЯреНрд░реЙрдиреНрдЧрд▓реА-рдЯрд╛рдЗрдкреНрдб рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреЙрд░реНрдо рдЙрджрд╛рд╣рд░рдг
рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ рддреЛ рдЙрд╕реЗ рдмреЗрдЭрд┐рдЭрдХ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред
рдЗрд╕рд▓рд┐рдП, рдПрдВрдЧреБрд▓рд░ рдирд╛рдЙ рдЕрд╡реЗрд▓реЗрдмрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг 10 , рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬ рд╣реИ рдФрд░ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкреЛрдВ рдХреЛ рдПрдВрдЧреБрд▓рд░ рдХреЗ рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕реНрдХрд░рдг 11 рддрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЧрд┐рд░рд╛рд╡рдЯ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрдЭрд╛рд╡реЛрдВ/рдкреАрдЖрд░ рдореЗрдВ рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди (рдпрд╛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡?) рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░рдкрддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рдРрд╕рд╛ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
interface Address {
name: Name;
}
interface Name {
firstName: string;
lastName: string;
}
рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ "рдЕрдиреБрд╡рд╛рджрд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
const myForm = new FormGroup<Address>({
name: new FormGroup<Name>({
firstName: new FormControl('John'),
lastName: new FormControl('Doe'),
})
})
рддреЛ, рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ: "рдпрджрд┐ рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдордЧреНрд░реБрдк рдмрдирд╛рдПрдВред рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд░рдгреА рд╣реИ, рддреЛ рдПрдХ рдлреЙрд░реНрдордПрд░реЗ рдмрдирд╛рдПрдВред рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рдЖрджрд┐рдо рдорд╛рди рд╣реИ, рддреЛ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдмрдирд╛рдПрдВред"
рд▓реЗрдХрд┐рди, рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдЕрдм рдЖрдк FormControls рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЕрдм рддрдХ рдореИрдВрдиреЗ рдЬреЛ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреЗ рд╣реИрдВ: рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рд╕рдВрдХреЗрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╣реИрдХ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреЙрд░реНрдо рдЧреНрд░реБрдк рдХреЗ рдмрдЬрд╛рдп рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореЗрд░рд╛ рдкреНрд░рд╢реНрди/рдкреНрд░рд╕реНрддрд╛рд╡: рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреНрдпрд╛ рдмреЛрд▓реЗрдВрдЧреЗ?
interface Address {
name: FormGroup<Name>;
}
interface Name {
firstName: FormControl<string>;
lastName: FormControl<string>;
}
const myForm = new FormGroup<Address>({
name: new FormGroup<Name>({
firstName: new FormControl('John'),
lastName: new FormControl('Doe'),
})
})
рдЗрд╕рдХрд╛ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╣реИрдХ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ :)
рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдирд╛рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрдорд╛ рд╕рдХреЗрдВ: https://codesandbox.io/s/falling-grass-k4u50?file=/src/app/app.component.ts
@MBuchalik , рд╣рд╛рдБ, рдпрд╣ рдкрд╣рд▓рд╛ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдгрдп рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдк "рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо" рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рднреА рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рди рд╣реИ - рджреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛: рдПрдХ рдлреЙрд░реНрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ - рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдПред
рджреВрд╕рд░реА рдУрд░, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╣рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрд╛рдзрд╛ рдХреЗ "рдордЬрдмреВрдд рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░реВрдкреЛрдВ" рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рд╣рдореЗрдВ рдПрдВрдЧреБрд▓рд░ рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдпрд╣ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рджреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред
@MBuchalik рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╡рд╣реА рд░рд╛рдп рд╕рд╛рдЭрд╛ рдХреА рд╣реИ рдФрд░ рдкреАрдЖрд░ рдХреЛ рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рдЙрдард╛рдпрд╛ рд╣реИ рдФрд░ рдХреЛрдгреАрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ ( @KostyaTretyak ) рдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИред
рдЖрдк рдкреАрдЖрд░ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
https://github.com/angular/angular/pull/37389#discussion_r438543624
рдЯреАрдПрд▓рдбреАрдЖрд░;
рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
рдпрджрд┐ рд╣рдо рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ - рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рдкрддреНрд░ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдПред
рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкрдврд╝рдирд╛ рдХрдард┐рди рд╣реИред
рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЖрдзреЗ рд╕рд╛рд▓ рдкрд╣рд▓реЗ fullTemplateTypeCheck
рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде)
рдореИрдВрдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ "рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдЬрд╛рддрд╛ рд╣реВрдВ" рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рд╣реИ:
https://github.com/angular/angular/issues/13721#issuecomment -643214540
рдХреЛрдбрд╕реИрдирдмреЙрдХреНрд╕ рдбреЗрдореЛ: https://codesandbox.io/s/github/gaplo917/angular-typed-form-codesandbox/tree/master/?fontsize=14&hidenavigation=1&theme=dark
рдЖрдкрдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ @KostyaTretyak рдФрд░ @ gaplo917 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ
рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)
рдпрджрд┐ рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ (!) рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ I (рдпрд╛ @ gaplo917) рд╕рдЪрд┐рддреНрд░ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЛ "рдирд┐рдХрд╛рд▓рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рддреЛ, рдЕрдм рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ FormControls рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЧрд╛ рдХрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирдирд╛ рд╣реИред рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?
рдЖрдкрдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ @KostyaTretyak рдФрд░ @ gaplo917 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ
рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)
рдпрджрд┐ рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ (!) рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ I (рдпрд╛ @ gaplo917) рд╕рдЪрд┐рддреНрд░ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЛ "рдирд┐рдХрд╛рд▓рдиреЗ" рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рддреЛ, рдЕрдм рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ FormControls рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЧрд╛ рдХрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирдирд╛ рд╣реИред рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?
@MBuchalik рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕" рдлреАрдЪрд░ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 2 рдореЙрдбрд▓ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реА рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 60+ рд░реВрдк рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ 3 рдЧрд╣рд░рд╛рдИ рд╕реНрддрд░ FormArray-FormGroup-FormArray
рд╕рд╛рде рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдореЙрдбрд▓ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИрдВ:
99.9% рд╕рдордп, рд╣рдо
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЪрд┐рддреНрд░рдг рд╣реИ:
interface FooApiData {
id: string
age: number
dob: string | null
createdAt: string
}
interface FooFormControlType {
id: TypedFormControl<string>
age: TypedFormControl<number>
// calendar view required JS date form control binding
dob: TypedFormControl<Date | null>
}
interface FooApiUpdateRequest {
id: string
dob: string | null
age: number
}
class FooForm extends TypedFormGroup<FooFormControlType> {
constructor(private fb: TypedFormBuilder, private initialValue: FooApiData) {
super({
id: fb.control(initialValue.id, Validators.required),
dob: fb.control(initialValue.dob === null ? new Date(initialValue.dob) : null),
age: fb.number(initialValue.age, Validators.required)
})
}
toRequestBody(): FooApiUpdateRequest {
const typedValue = this.value
return {
id: typedValue.id,
dob: typedValue.dob !== null ? moment(typedValue.dob).format('YYYYMMDD') : null,
age: typedValue.age
}
}
}
const apiData = apiService.getFoo()
const form = new FooForm(new TypedFormBuilder(), apiData)
// assume some UI changes the form value
function submit() {
if(form.dirty && form.valid){
const payload = form.toRequestBody()
apiService.updateFoo(payload)
}
}
рдкреАрдПрд╕ рдпрд╣ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ
рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдПрдХрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @KostyaTretyak рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЕрдм рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рд╣реИрдХ" рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдлрд┐рд░ рд╕реЗ "рдХреНрд▓реАрди" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ 2 рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)
рдпрд╣рд╛рдВ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ FormControl
ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдХрд╣реАрдВ рди рдХрд╣реАрдВ 5-30% рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдо рдПрдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо FormControl
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ 70-95% рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП - рдмрд╕ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрдВ (рджреЗрдЦреЗрдВ Control<T>
, рдЗрд╕реЗ "рджреВрд╕рд░рд╛ рдореЙрдбрд▓" рдХрд╣рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ):
interface FormModel {
date: Control<Date>;
}
рдХреНрдпрд╛ Control<T>
рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣реИрдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? - рд╣рд╛рдБ, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рд╣реИрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдореЛрдЯрд╛ рд╣реИрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдРрд╕реЗ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЗрд░рд╛рджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИрдВред
рдУрд╣, рдореБрдЭреЗ Control<T>
рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдпрд╛рдж рдЖ рдЧрдП рдЬрдм рд╣рдореЗрдВ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рджреЛ рдореЙрдбрд▓реЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
import { FormBuilder, Control } from '@ng-stack/forms';
// External Form Model
interface ExternalPerson {
id: number;
name: string;
birthDate: Date;
}
const formConfig: ExternalPerson = {
id: 123,
name: 'John Smith',
birthDate: new Date(1977, 6, 30),
};
interface Person extends ExternalPerson {
birthDate: Control<Date>;
}
const fb = new FormBuilder();
const form = fb.group<Person>(formConfig); // `Control<Date>` type is compatible with `Date` type.
const birthDate: Date = form.value.birthDate; // `Control<Date>` type is compatible with `Date` type.
рд▓реЗрдХрд┐рди рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдУрд╡рд░рд╣реЗрдб рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рд╣реИ:
interface Person extends ExternalPerson {
birthDate: Control<Date>;
}
@ArielGueta рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, Control<T>
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдЕрдм рдЬреНрдЮрд╛рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣реИ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдореИрдВ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ Control<T>
, рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред
@ArielGueta рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
Control<T>
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдЕрдм рдЬреНрдЮрд╛рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣реИ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдореИрдВ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗControl<T>
, рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред
@KostyaTretyak рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рдпрд╣ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ "рдХрдВрдЯреНрд░реЛрд▓ рдЯрд╛рдЗрдк" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рдд рд╣реИред
рдПрдХ рдкреВрд░реНрдг "рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдХрд╛рд░" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд▓рд╛рдЗрд╡ рдбреЗрдореЛ: https://codesandbox.io/s/lucid-bassi-ceo6t?file=/src/app/demo/forms/type -test.ts
рдпрд╛рдиреА рдореИрдВ Control рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдгреАрдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЦреАрдВрдЪреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдереАред
рдареАрдХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреАрдЖрд░ (рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╡рд╛рд▓реЗ) рдХрднреА рднреА рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ?
@MBuchalik , рдЗрд╕ рд╕рдордп (рдХреЛрдгреАрдп v10), рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреНрд░рдкрддреНрд░ рдореЙрдбрд▓ рд╣реИ:
interface FormModel {
date: Date;
}
рдФрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдореЗрдВ рд╣рдо date
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
get date() {
return this.formGroup.get('date') as FormControl;
}
// ...
this.date.value as Date;
рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рдкрддреНрд░ рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
get date() {
return this.formGroup.get('date') as FormControl<Date>;
}
// ...
this.date.value; // Here Date type
@ gaplo917 , @MBuchalik , рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдлрд╝реЙрд░реНрдо рдореЙрдбрд▓ рдорд╛рдиреЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдУрд╡рд░рд╣реЗрдб рдФрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдкреАрдЖрд░ рдбреНрд░рд╛рдлреНрдЯ рджреЗрдЦреЗрдВред
рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА, рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рди рдХрд┐ рдлреЙрд░реНрдо рдХрдВрдЯреНрд░реЛрд▓ рдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд▓рд┐рдПред
рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд╛рдВрдд рдкрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛;) рдХреНрдпрд╛ рдЖрдк рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ? (рдЦрд╛рд╕рддреМрд░ рдкрд░ рдРрд╕реЗ рд╕рд╛рдорд╛рди рдкрд░, рдЬреЛ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?)
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдкрд┐рдЫрд▓реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реБрдЭрд╛рд╡: рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдмрдирд╛рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдард┐рди рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо рд╢рд╛рдпрдж рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╣рдо рдлреЙрд░реНрдордХрдВрдЯреНрд░реЛрд▓, рдлреЙрд░реНрдордЧреНрд░реБрдк рдФрд░ рдлреЙрд░реНрдордЕрд░реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдирдП рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ StrictFormControl<T>
рдФрд░ StrictFormGroup<T>
рдпрд╛ рдЬреЛ рднреА рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реЛ)ред рдпреЗ рддрдм рд╣реИрдВ рдЬрдм рд╣рдо рдЯрд╛рдЗрдк рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВред рд▓рд╛рдн: рд╣рдо 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред :)
рдореЗрд░реЗ рдЪрд┐рддреНрд░рдг рдкрд░ рдХреБрдЫ рдШрдВрдЯреЗ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛;)
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рджрд┐рдиреЛрдВ рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
Control<T>
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реА рддрд░рд╣ рдлреЙрд░реНрдо рдореЙрдбрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреБрди: рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИредinterface FormModel {
one: FormGroup<{two: FormControl<string>}>;
}
рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ formGroup.controls.one.value
, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ {two: string}
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рддреЛ рдЖрдИрдбреАрдИ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдореВрд▓реНрдпред
рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ formGroup.controls.one.value рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХреЗрдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ {рджреЛ: рд╕реНрдЯреНрд░рд┐рдВрдЧ} рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рдеред рддреЛ рдЖрдИрдбреАрдИ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдореВрд▓реНрдпред
рдареАрдХ рд╣реИ рддреЛ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдЧрдпрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
interface FormModel {
one: FormGroup<Two>;
}
interface Two {
two: FormControl<string>;
}
const myForm = new FormGroup<FormModel>({
one: new FormGroup<Two>({
two: new FormControl('')
})
});
(рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рдмрдирд╛ рджрд┐рдпрд╛;))
рдЕрдЧрд░ рдореИрдВ рдЕрдм myForm.controls.one.value
рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ:
рддреЛ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рджреЛ" рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдкрддреНрд░ рдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдХреНрд╖рдо рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рддреЛ, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЖрдВрд╢рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рдЕрдХреНрд╖рдо рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдХреМрди рд╕реЗ рдирд╣реАрдВред
рддреЛ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рджреЛ" рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдХреНрдпрд╛? рдирд╣реАрдВред
рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг:
interface FormModel {
one: FormGroup<{two: FormControl<string>}>;
}
let formGroup: FormGroup<FormModel>;
const some = formGroup.controls.one.value;
value
рдкрд░ рдорд╛рдЙрд╕ рд╣реЛрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ codesandbox рдкрд░ рдХреНрдпрд╛ рджреЗрдЦрддрд╛ рд╣реВрдВ:
(property) FormGroup<FormGroupControls<{ two: FormControl<string>; }>>.value: PartialFormGroupValue<FormGroupControls<{
two: FormControl<string>;
}>>
рдпрд╣рд╛рдВ PartialFormGroupValue
рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ PartialFormValue
рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЖрд╣, рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ред рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╣реИ рдирд╛? рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдмрдЧ рдпрд╛ рдЙрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗред
рдареАрдХ рд╣реИ, рдПрдХ рдмрд╛рд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдИрдбреАрдИ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред (рдмреЗрд╢рдХ, рдпрд╣ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рд┐рд░реНрдл {two?: string}
ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рд░рд╛рдп рд╣реИред)
рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ Control<T>
, рддреЛ рдЖрдк рдЗрд╕реЗ sth рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВрдЧреЗ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛? рдФрд░ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдЖрдВрд╢рд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВрдЧреЗ?
рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ
, рддреЛ рдЖрдк рдЗрд╕реЗ sth рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╣рдЯрд╛рдПрдВрдЧреЗ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛? рдФрд░ рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлреЙрд░реНрдо рд╡реИрд▓реНрдпреВ рдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдЖрдВрд╢рд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдпреЗрдВрдЧреЗ?
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ:
(property) FormGroup<FormGroup<{ two: FormControl<string>; }>>.value: ExtractGroupValue<FormGroup<{
two: FormControl<string>;
}>>
рдореИрдВрдиреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рд▓рд┐рдП рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛:
рдХреНрдпрд╛ рдЖрдк рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ? (рдЦрд╛рд╕рддреМрд░ рдкрд░ рдРрд╕реЗ рд╕рд╛рдорд╛рди рдкрд░, рдЬреЛ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?)
рд╡реИрд╕реЗ, рдореИрдВрдиреЗ Control<T>
рд╕рд╛рде рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдХреЛрдгреАрдп 10 рдФрд░ [formControl]
рд╕рд╛рде HTML рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╣ рдорд╛рд░реНрдЧ рд╣реИ рдЬреЛ рдореИрдВ рдЧрдпрд╛ рдерд╛:
рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (https://github.com/angular/angular/issues/36405#issuecomment-655110082), рдореЗрд░реЗ рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдРрд╕реЗ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП FormGroup
рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ . рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
class UserFormGroup extends FormGroup {
constructor() {
super({
id: new FormControl(null, Validators.required),
name: new FormControl(null, Validators.required),
});
}
рдЗрд╕рдХреЗ рд▓рд┐рдпреЗ:
// everything will extend these two
export class EnhancedFormGroup<T extends { [key: string]: AbstractControl }> extends FormGroup
{
controls!: T;
}
export class EnhancedFormArray<T extends AbstractControl> extends FormArray
{
controls!: T[];
}
// reworked form from above
function formDefinition() {
return {
id: new FormControl(null, Validators.required),
name: new FormControl(null, Validators.required),
};
}
class UserFormGroup extends EnhancedFormGroup<ReturnType<typeof formDefinition>> {
constructor() {
super(formDefinition());
}
рдЙрд╕ рд╕рдордп form.controls
рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА, { id: FormControl, name: FormControl }
рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛, рдФрд░ рдЕрдЧрд░ рдлреЙрд░реНрдо рдиреЗрд╕реНрдЯреЗрдб рдлреЙрд░реНрдордЧреНрд░реБрдк рдпрд╛ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдерд╛ рддреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХрддреНрд░рд┐рдд рд╣реЛрдЧрд╛ред
formDefinition
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рд╕рд╛рдл рд╕рдорд╛рдзрд╛рди рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдлреЙрд░реНрдо рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмреАрдЪ рджреЛрд╣рд░рд╛рд╡ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд░ рдЖ рд╕рдХрддрд╛ рдерд╛ред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдк FormGroup
рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрд┐рдирд╛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдареАрдХ рд╣реИ, рдпрд╣ рдЙрди рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝рддреЗ/рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ; рд╡реЗ controls
рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗ
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реЗ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ FormGroup рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ; рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:
function createEnhancedFormGroup<T extends { [key: string]: AbstractControl }>(controls: T) {
return new EnhancedFormGroup<T>(controls);
}
const form = createEnhancedFormGroup({
id: new FormControl(null, Validators.required),
name: new FormControl(null, Validators.required),
});
2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
... рдпрд╛ рдЖрдк рдЗрд╕реЗ FormGroup
рд╡рд░реНрдЧ рдореЗрдВ рд╣реА рд╕реЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ ( FormBuilder
рд╢рд╛рдпрдж?)
export class EnhancedFormGroup<T extends { [key: string]: AbstractControl }> extends FormGroup
{
controls!: T;
static create<T extends { [key: string]: AbstractControl }>(controls: T) {
return new EnhancedFormGroup<T>(controls);
}
}
const form = EnhancedFormGroup.create({
id: new FormControl(null, Validators.required),
name: new FormControl(null, Validators.required),
});
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 3
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ value
s рдкрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦ рдмрдирд╛рдпрд╛ рд╣реИ:
https://medium.com/youngers-consulting/angular-typed-reactive-forms-22842eb8a181
рдЗрд╕реЗ рдЕрдм рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░реЛрдбрдореИрдк рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://angular.io/guide/roadmap#better -developer-ergonomics-with-strict-typing-for-angularforms
@pauldraper рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ~ 2 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреЗ рд░реЛрдбрдореИрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ? рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рд╡рд╣ рд╣реИ рд╢реАрд░реНрд╖рдХ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реАред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА "рднрд╡рд┐рд╖реНрдп" рдЦрдВрдб рдореЗрдВ рд╣реИред рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ 2 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдерд╛ред
@MBuchalik рд╢рд╛рдпрдж 2 рдорд╣реАрдиреЗ рд╕реЗ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЕрд░реЗ, рдореИрдВ рдПрдВрдЧреБрд▓рд░ рдЯреАрдо рд╕реЗ рдПрдХ рдЕрдкрдбреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: рд╣рдо рдЖрдкрдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд╣реИред рд╣рдо рдЬрд▓реНрдж рд╣реА рдЕрдзрд┐рдХ рдордЬрдмреВрддреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЛрдВ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрдирд╛ рдФрд░ рдЖрдкрдХреА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдлрд┐рд░ рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!