Vscode-ng-language-service: рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреИрдирд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЕрдЧре░ 2017  ┬╖  70рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/vscode-ng-language-service

рд╡рд┐рдВрдбреЛрдЬ 10 рдкрд░ 0.1.4 рдореЗрдВ

errors?.required рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рд╣реИ

image

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдорджрдж рдорд┐рд▓реА рд╣реЛрдЧреАред

рд╕рднреА 70 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

OS X 10.11.6 (El Capitan) рдкрд░ рднреА рд╣реЛ рд░рд╣рд╛ рд╣реИред

OS: OS X 10.11.6
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдВрд╕реНрдХрд░рдг: 0.1.4
рд╡реАрдПрд╕ рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг: 1.15.1

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рдВрдбреЛ 10 x64 рдкрд░ рднреА рдорд┐рд▓реА
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдВрд╕реНрдХрд░рдг 0.1.7
рд╡реАрдПрд╕ рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг 1.15.1
рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЬрд▓реНрдж рдареАрдХ рдХрд░реЗрдВ

рдпрд╣рд╛рдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ред
рддреНрд░реБрдЯрд┐ рдпрд╣ рд╣реИ: 'рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛' рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред 'NgModel' рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ 'ред

OS: macOS 10.13
рдПрдХреНрд╕рдЯреЗрдВрд╢рди: 0.1.7
рд╡реАрдПрд╕ рдХреЛрдб: 1.16.1
рдХреЛрдгреАрдп: 4.4.3
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ: 2.5.2

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ! рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди?

рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ app.module рдпрд╛ рдореЗрд░реЗ рдШрдЯрдХ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдлрд╝реЙрд░реНрдо рдореМрдЬреВрдж рд╣реИ?

@VladBozhinovski рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд @ рдХреЛрдгреАрдп / рд░реВрдк рдЖрдпрд╛рдд рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░: https://github.com/angular/vscode-ng-language-service/issues/179

рд╣рд╛рдБ, рдореБрдЭреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ ...

рдореИрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ .... рдХреЛрдИ рд╕рдорд╛рдзрд╛рди?

рдПрдХ рд╣реА рдореБрджреНрджрд╛, рдХрд┐рд╕реА рдХреЛ рднреА рдПрдХ рддрдп рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ?

рдПрдХ рд╣реА рдореБрджреНрджрд╛ рдпрд╣рд╛рдБред рдЕрднреА рддрдХ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛

рдореБрдЭреЗ рднреАред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдБ :)

рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реБрдИред рдЖрдк рд▓реЛрдЧ рдЗрд╕реЗ 'рдИрдореЗрд▓? .Error.required' рдХреА рддрд░рд╣ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ

@ Duanthse03268 рдиреЗ рд░реЗрдб рд▓рд╛рдЗрди рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрд╕реЛрд▓ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ?

FoodFormComponent.html:9 ERROR TypeError: Cannot read property 'minlength' of undefined at Object.eval [as updateDirectives] (FoodFormComponent.html:10) at Object.debugUpdateDirectives [as updateDirectives] (core.es5.js:13056) at checkAndUpdateView (core.es5.js:12236) at callViewAction (core.es5.js:12601) at execComponentViewsAction (core.es5.js:12533) at checkAndUpdateView (core.es5.js:12242) at callViewAction (core.es5.js:12601) at execComponentViewsAction (core.es5.js:12533) at checkAndUpdateView (core.es5.js:12242) at callWithDebugContext (core.es5.js:13456)

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпреВ рдЖрдпрд╛рдд рдХрд░реЗрдВ
'@ рдХреЛрдгреАрдп / рд░реВрдкреЛрдВ' рд╕реЗ рдЖрдпрд╛рдд {FormMMule, Validators};

рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдИ рднреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рди рдХрд░реЗ:

screen shot 2018-01-08 at 22 56 53

FormMule рдФрд░ Validators @ рдХреЛрдгреАрдп / рд░реВрдкреЛрдВ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдореИрдВрдиреЗ @ Duanthse03268 рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рднреА рдХрд┐рдпрд╛, рдФрд░ рди рдХреЗрд╡рд▓ рдпрд╣ рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЬрдм myField рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ (TypeError: null рдХреА рд╕рдВрдкрддреНрддрд┐ 'рдЖрд╡рд╢реНрдпрдХ' рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ) рдпрджрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред '' 'рддреНрд░реБрдЯрд┐рдпреЛрдВ' рдХреЗ рдмрд╛рджред

рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рдВрдкрд╛рджрдХ (VSCode) рдореЗрдВ (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рдд) рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА (рдмрд╛рдХреА рд╕рдм рдЖрдк рдмрд╕ 'рдПрдирдЬреА рдПрдирдЬреА ...' рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП):

app.module.ts
app.component.ts
app.component.html

рд╕рдВрд╕реНрдХрд░рдг:

рдПрдХреНрд╕рдЯреЗрдВрд╢рди: 0.1.7
VSCode: 1.19.1
рдХреЛрдгреАрдп рд╕реАрдПрд▓рдЖрдИ: 1.6.3
рдиреЛрдб: 9.2.1
OS: macOS 10.12.6
рдХреЛрдгреАрдп: 5.1.3
рдХреНрд░реЛрдо: 63.0.3239.84

рдЖрдкрдиреЗ 'myfield? .Error.required' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛?

рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛: "рди рдХреЗрд╡рд▓ рдпрд╣ рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЬрдм myField рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ (TypeError: рдкрдврд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╕рдВрдкрддреНрддрд┐ 'рдЖрд╡рд╢реНрдпрдХ' рд╢реВрдиреНрдп ' ) "ред

рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 'myField; .errors.required' рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред '?' рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рддреНрд░реБрдЯрд┐рдпреЛрдВ' рдХреЗ рдмрд╛рдж рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рднреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЧрд▓рдд рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЗ рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдмреЗрд╣рдж рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рд▓ рд░реЗрдЦрд╛рдПрдБ рдЕрднреА рднреА рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореИрдВ joonashak рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕реНрддреБрдд рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рд╕реНрд╡рд░реВрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдорджрдж рдорд┐рд▓реА рд╣реЛрдЧреАред

рдХреЗрд╡рд▓ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб :(

IntelliJ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред @Ahnset рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ?

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ 'рдХрд┐рд╕реА' рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдмреНрд░реИрдХреЗрдЯ рд╕рдВрдкрддреНрддрд┐ рдПрдиреЛрдЯреЗрд╢рди, рдХреНрд▓рд╛рдЗрдВрдЯрдлрд╝рд░реНрд╕реНрдЯрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдмреБрд░рд╛, vscode рдХреЗ рдирд╡реАрдирддрдо рдЕрджреНрдпрддрди рдХреЗ рд╕рд╛рде, рдореЗрд░реА рдлрд╝рд╛рдЗрд▓ рдЯреНрд░реА рдПрдХ рдХреНрд░рд┐рд╕рдорд╕ рдЯреНрд░реА рдХреА рддрд░рд╣ рдмрди рдЧрдИ рд╣реИ: christmas_tree:

@adickenscheidt рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдм рдХреЗ рд▓рд┐рдП рдЧреВрдВрдЧрд╛ рд╕рд╣рдордд рд╣реВрдБред

рд╣рдЯрд╛рдП рдЧрдП рдХреЛрдгреАрдп рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ ...

@ Duanthse03268 рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдп! рдзрдиреНрдпрд╡рд╛рджред

@adickenscheidt
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдзрдиреНрдпрд╡рд╛рдж

рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд░ рджрд┐рдпрд╛ред рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА @ Duanthse03268

@ Duanthse03268 рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдп! рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
<mat-select [(ngModel)]="object?.nestedObject?.property" name="property" #property="ngModel">
object?.object?.property рдкрд░ рд╕реБрдкрд░рдХреЛрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд░рд╣реА рд╣реИрдВ

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдмрджрд╕реВрд░рдд рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
name?.errors && name?.errors['required']

email.errors ['рдЖрд╡рд╢реНрдпрдХ'] рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

@ guignol1981 рд╕реЙрд▓реНрдпреВрд╢рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

рдХреЗрд╡рд▓ рддрддреНрд╡ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдирд┐рд╢рд╛рдиред рдпрд╣ рдЗрддрдирд╛ рдмрджрд╕реВрд░рдд рдирд╣реАрдВ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ:
"рдлрд╝реЙрд░реНрдо? .рдЧреЗрдЯ ('рдирд╛рдо')ред рддреНрд░реБрдЯрд┐рдпрд╛рдБ редrequired"
"рдлрд╝реЙрд░реНрдо редрдЧреЗрдЯ ('рдирд╛рдо')ред рддреНрд░реБрдЯрд┐рдпрд╛рдВред ['рдЖрд╡рд╢реНрдпрдХ']"
"рдлрд╝реЙрд░реНрдо? рднреВрд▓ ('рдирд╛рдо')ред рддреНрд░реБрдЯрд┐рдпрд╛рдВ?

рдирдорд╕реНрдХрд╛рд░ рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рдЖрдЬрдорд╛рдПрдБред
рдлреЙрд░реНрдо.рд╢рд╣рд░ ('рдЖрд╡рд╢реНрдпрдХ');

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж @antonheck

рдХреБрдЫ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рд╣рд╛рдБред рд▓реЗрдХрд┐рди рд╡рд╣ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЕрдкрдирд╛ рдХреЛрдб рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдмрджрд╕реВрд░рдд, рд╣реИрдХреА рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЖрдИрдбреАрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЕрдкреАрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рд╢реБрд░реВ рд╕реЗ рд╣реА рд╕рд╣реА рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рдХреЛрдб рд╡рд╛рд▓реА рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдФрд░ рд╕рдВрджреЗрд╢ рд╣реИ:

class MyComponent {
  form: FormGroup;
}

рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде:

<app-errors [control]="form.controls.email">

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ :

рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 'рдИрдореЗрд▓' рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред '__type' рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ

рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ (рдпрд╣ AbstractControl рдпрд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ):

{  [key: string]: AbstractControl;  };

рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб (рд╡рд┐рдВрдбреЛрдЬрд╝) рдФрд░ рдХреЛрдгреАрдп рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдпрд╣ рд╕рдВрджреЗрд╢ рд╣реИ, рд▓реЗрдХрд┐рди ng lint ред

рдЕрдм рддрдХ рдХрд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╕рдорд╛рдзрд╛рди:

"!!" рдХреЛ рдЯрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ,
рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕рдлрд▓ рд╣реБрдЖред

image

_from: https://github.com/angular/vscode-ng-language-service/issues/126#issuecomment -366200219_

рдзрдиреНрдпрд╡рд╛рдж tmrony, рдХрдИ рджрд┐рдиреЛрдВ рдХреЗ рдЦреЛрдЬ рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди ...

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдРрд╕рд╛ рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "AbstractControl" рдХреА "рддреНрд░реБрдЯрд┐рдпреЛрдВ" рдореЗрдВ рдХреЛрдИ рд╕рдЦреНрддреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ " ValidationErrors " рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ

рддреЛ рдПрдХ рдорд╛рдиреНрдпрддрд╛ рдирд┐рдпрдо рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддреА рд╣реИред

(btw рднрд▓реЗ рд╣реА рдореИрдВ рд╕рддреНрдпрд╛рдкрди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд╕реАрдзреЗ рдореБрдЭреЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ, рдРрдк рдареАрдХ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)

image

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реИ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ "рд╣реИрдпрд░" рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

   <span *ngIf="(firstName.dirty || firstName.touched) && firstName.hasError('required')">First name is required.</span>

@ boban984 рд╕рдорд╛рдзрд╛рди рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ ...ред

@adickenscheidt рд╕реЙрд▓реНрдпреВрд╢рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛! рдзрдиреНрдпрд╡рд╛рдж

"price.errors ['рдЖрд╡рд╢реНрдпрдХ']" -> рдХрд╛рдо рдХрд┐рдпрд╛
"" price.errors.required "-> рдХрд╛рдо рдХрд┐рдпрд╛

"рдХреАрдордд ?errред?ред рдХреНрд░реЗрдпрд░реНрдб" рдХреЛ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ "рдлреБрд▓рдирд╛рдо? .errors .required" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

"price.errors ['рдЖрд╡рд╢реНрдпрдХ']" -> рдХрд╛рдо рдХрд┐рдпрд╛

рдпрд╣ рд╕рдВрдХрд▓рдХ 'рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ' рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдкрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

@ boban984
рдпрд╣ рд╡рд┐рдЬреЗрддрд╛ рд╕рдорд╛рдзрд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ hasError() рдкрджреНрдзрддрд┐ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╢рд░реНрдд рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ ... рдХреЛрдИ рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореВрд▓ рдХрд╛рд░рдг рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдм рдПрдХ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИред errors рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ ( [key: string]: any ) рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ TS рдХреЛрдб рдореЗрдВ, рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ myControl.errors.anythingYouLike рд╕рд╛рдл-рд╕рд╛рдл рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рдЪрд╛рд╣реЗ рдЖрдк рдХрд┐рддрдиреЗ рднреА рд╕рдЦреНрдд-рдЭрдВрдбреЗ рд▓рдЧрд╛ рд▓реЗрдВред ред рдпрд╣ рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдиреЗ рдХреЗ рдкреВрд░реЗ рдмрд┐рдВрджреБ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдордирдорд╛рдиреА рдЧреБрдг рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЙрдЯ-рдиреЛрдЯреЗрд╢рди рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕-рдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реИред рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдЗрдВрдбреЗрдХреНрд╕-рдиреЛрдЯреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ control?.errors['required'] рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд▓рдд рдХреЗ рд░реВрдк рдореЗрдВ рдбреЙрдЯ-рдиреЛрдЯреЗрд╢рди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред

рддреАрди рд╕рдорд╛рдзрд╛рди:

<span *ngIf=" username.errors['email']">must be email</span>

<span *ngIf="!!username?.errors.email">must be email</span>

<span *ngIf="username.hasError('email')">must be email</span>

рдореБрдЭреЗ рддреАрд╕рд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ

@ boban984 рдорд╣рд╛рди рд╕рдорд╛рдзрд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг

thnks, рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ !. ЁЯСНЁЯП╝
рдореИрдВ рдХрдВрд╕реЛрд▓ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВ ors

рдирдорд╕реНрдХрд╛рд░ рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рдЖрдЬрдорд╛рдПрдБред
рдлреЙрд░реНрдо.рд╢рд╣рд░ ('рдЖрд╡рд╢реНрдпрдХ');

рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдерд╛, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: myForm.hasError ('рдЖрд╡рд╢реНрдпрдХ', 'myField')ред

рдзрдиреНрдпрд╡рд╛рдж @antonheck

рдирдорд╕реНрдХрд╛рд░ рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рдЖрдЬрдорд╛рдПрдБред
рдлреЙрд░реНрдо.рд╢рд╣рд░ ('рдЖрд╡рд╢реНрдпрдХ');

рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдерд╛, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: myForm.hasError ('рдЖрд╡рд╢реНрдпрдХ', 'myField')ред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди @ boban984 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: "myField.hasError ('рдЖрд╡рд╢реНрдпрдХ')"ред :)

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛:

  • example.component.ts:
this.myForm = this.formBuilder.group({
      field: ['', [Validators.required, Validators.maxLength(10)]]
});

get getField() { return this.myForm.get('field'); }
  • example.component.html:
<div *ngIf="getField.errors" class="invalid-feedback">
  <div *ngIf="getField.hasError('required')"> Text required </div>
  <div *ngIf="getField.hasError('maxlength')"> Text maxLength </div>
</div>

рдореБрдЭреЗ рдорджрджрдЧрд╛рд░ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА @bePericon рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рдзрдиреНрдпрд╡рд╛рдж!

<input type="text" formControlName="name" class="form-control" placeholder="Full name"> <div *ngIf="submitted && f['name'].errors" class="alert alert-danger"> <div *ngIf="f['name'].errors.required">Full Name is required</div> </div>
рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдгреАрдп 7 рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛

рддреЛ рджреЛ рд╕рд╛рд▓ рдХреЗ рдмрд╛рдж, рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? ЁЯдг
рд╕рдВрдмрдВрдзрд┐рдд: https://github.com/angular/vscode-ng-language-service/issues/110

рддреЛ рджреЛ рд╕рд╛рд▓ рдХреЗ рдмрд╛рдж, рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? ЁЯдг
рд╕рдВрдмрдВрдзрд┐рдд: # 110

рдпрд╣ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрджрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ)ред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ngModel рдХреЗ рдХрдЪреНрдЪреЗ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдПрдХреНрд╕реЗрд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕ рдзрд╛рдЧреЗ рдиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рддрдп рд╣реИ? рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рднреА рдХрдИ рдмрд╛рд░ рд╣реИрд░рд┐рд╕рд░ рдЙрдореНрд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред myControl.errors.maxlength рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓рд╛рд▓ рдирд╣реАрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ред рдпрд╣ рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рд╡рд┐рд╕реНрддрд╛рд░ 0.801.1 рдХреЗ рд╕рд╛рде рд╣реИ, рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ v8.1.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИред

@ thw0rted рддреЛ, myControl.errors.required рдФрд░ .pattern (рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЗрдирдкреБрдЯ рдЯреИрдЧ рдкрд░ required рд╡рд┐рд╢реЗрд╖рддрд╛ рдЫреВрдЯ рдЧрдИ, рдЬреЛ рдПрдХ рдмрдбрд╝реА рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣реА рдереА), рд╡реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд╛рдлреА рдХрд╛рдо рд╣реИред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди vsCode рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдФрд░ рдореИрдВ рдЕрднреА рднреА рд╕реНрдХреНрд╡рд┐рдЧреНрд▓рд┐рд╕ рдХреЛ рдЕрдЬреАрдм рд░реВрдк рд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдкрд▓ рдХреЗ рд▓рд┐рдП .hasError рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЫрдбрд╝реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЕрднреА рднреА рдбреЙрдХреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ / рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ 'рдХрд┐рд╕реА' рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдмреНрд░реИрдХреЗрдЯ рд╕рдВрдкрддреНрддрд┐ рдПрдиреЛрдЯреЗрд╢рди, рдХреНрд▓рд╛рдЗрдВрдЯрдлрд╝рд░реНрд╕реНрдЯрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░ рджрд┐рдпрд╛ред рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдХреЛрдб рддрдм рднреА рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдЬрдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рд▓ рд░реЗрдЦрд╛рдПрдВ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рд╣рд╛рдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рд▓рд╛рд▓ рд░реЗрдЦрд╛рдПрдВ рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╣реА рд╡рд░реНрддрдиреА рдФрд░ рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╣реЛрдиреЗ рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред

рд╣реИрд╕рд░реНрд░реЛрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдлреЙрд░реНрдо рдХреЗ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдЯреНрд░реЛрд▓ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдЯ рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕реЗ

class MyComponent {
  form: FormGroup;
}

рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде:

<app-errors [control]="form.controls.email">

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ :

рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 'рдИрдореЗрд▓' рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред '__type' рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ

рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛:

<app-errors [control]="form.get('email')">

рд╡рд╣реА рдореБрджреНрджрд╛ред

f.email.errors.email.required рдлреЗрд▓
!! f.email.errors.email.required рдлреЗрд▓
f.email?.errors.email.required рд╡рд┐рдлрд▓
fред .email .errors.email.required рд╡рд┐рдлрд▓
f.email.errorред ['рдЖрд╡рд╢реНрдпрдХ'] рд╡рд┐рдлрд▓
f.email?.error.I'required '] рд╡рд┐рдлрд▓

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

f ['рдИрдореЗрд▓']ред рддреНрд░реБрдЯрд┐рдпрд╛рдБ

Https://github.com/angular/angular/pull/33884 рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдирд┐рд╖реНрдХреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдореБрджреНрджрд╛ рд╕реНрд╡рддрдГ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдорд╛рди рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░реЗрдВред

рд╣рдорд╛рд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд▓реЙрдХрд┐рдВрдЧ рдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред

_ рдпрд╣ рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмреЙрдЯ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ ред_

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Liero picture Liero  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

daveriedstra picture daveriedstra  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mhamri picture mhamri  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sheikalthaf picture sheikalthaf  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pfeigl picture pfeigl  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ