关键词:
【中文标题】模板驱动表单中的表单验证问题【英文标题】:Problem with form validation in template driven form 【发布时间】:2019-04-16 12:03:09 【问题描述】:我正在使用 Angular 6 开发一个 Web 应用程序。我想创建一些受 HTML 输入组件启发的自定义组件。例如:
CustomComponent.ts(打字稿)
@Component(
selector: 'custom-component',
templateUrl: './custom-component.html',
providers: [
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => InputTextComponent)
]
)
export class CustomComponent
@Input() name: string;
@Input() isRequired: boolean;
CustomComponent.html(模板)
<input type="text"
[attr.name]="name"
[required] = "isRequired"
/>
我有这个问题。假设我们在这个模板中使用我的组件:
<form #myForm="ngForm" ngNativeValidate>
<custom-component
name="myName"
[isRequired] = true
ngModel
></custom-component>
<button type="submit" (click)="method()">Click</button>
required
属性在<input type="text/>
(<custom-component>
的包装组件)中正确初始化。问题是这样的(这是一个 Angular 问题!):在这个使用代码中:
method()
console.log(this.myForm.valid);
对象myForm.valid
(其中myForm
与上一个模板中的#myForm
相关联)始终返回true
值,即使在文本字段中没有输入任何内容。这种行为是错误的:如果我不在必填字段中插入任何内容,我希望此值为 false。
【问题讨论】:
【参考方案1】:要将验证添加到您的自定义输入组件,您应该将以下内容添加到您的提供程序:
provide: NG_VALIDATORS,
useExisting: forwardRef(() => InputTextComponent),
multi: true
您必须在 InputTextComponent 中实现默认方法:
validate(control: AbstractControl): ValidationErrors | null
return null;
如果您使用您通过 NG_VALUE_ACCESSOR 实现的 writeValue() 方法正确更新了组件中名为 value 的属性,然后确保调用(您可以通过在默认输入上实现更改事件):
this.propagateChange(this.value);
最后将您的 isRequired 输入更改为默认的 required 属性。
@Input() required: boolean;
您的 NgModel 现在应该可以正确更新了。
编辑: 避免使用 required (但这是正确的方法)。在验证方法中放置以下代码:
validate(control: AbstractControl): ValidationErrors | null
return this.isRequired && this.value.length === 0 : required: true : null;
当 Angular 运行它自己的验证时,它会调用这个方法。当此方法返回除 null 以外的任何内容时,该对象将添加到 FormControl 和 NgModel 中的 errors 属性中。
这是一个巨大的话题,有一些很棒的文章正确地解释了这一切。但是,正如所问的,这应该可以解决它。
【讨论】:
谢谢,除了最后一步,我什么都做了。为什么我需要编辑输入名称(@Input() required: boolean;)以及这如何反映在我的自定义组件的模板中? 好的,它工作。但是如果我想保留 isRequired 属性怎么办? 我想避免使用调用者的“必需”属性...我更喜欢使用调用者的自定义属性“isRequired” 当使用 NgModel 和 ControlValueAccessor 时,你通知 Angular 你将把这个组件当作默认的 HTML 输入。您可以使用 isRequired,但是,您的输入元素不是组件内的输入,而是您的 InputTextComponent 本身。我将更新我的答案以包含解决方法,但是,我建议不要这样做。这就是为什么建议像使用实际输入一样使用 require。【参考方案2】:您应该检查表单是否脏并且是否有效。所以两者都必须是真的。否则显示它没有被改变。
【讨论】:
Angular 2 模板驱动的表单组验证
】Angular2模板驱动的表单组验证【英文标题】:Angular2templatedrivenformgroupvalidation【发布时间】:2017-06-2707:57:15【问题描述】:我有一个关于angular2模板驱动表单的问题。我已经设置了其中一个表单,如果表单组中的一个输入无效,... 查看详情
Angular - 模板驱动的表单 - 控制器中的自定义验证器功能
】Angular-模板驱动的表单-控制器中的自定义验证器功能【英文标题】:Angular-Templatedrivenforms-customvalidatorfunctioninthecontroller【发布时间】:2019-03-2306:30:29【问题描述】:由于在ngModel中使用响应式表单是deprecatedinAngular6,并且我的项... 查看详情
angular2模板驱动的表单验证问题
】angular2模板驱动的表单验证问题【英文标题】:angular2templatedrivenformvalidationissue【发布时间】:2018-03-0103:32:05【问题描述】:我对angular2模板驱动的表单验证有问题,以下是我的表单的代码。<h1>page_title</h1><div*ngIf="suc... 查看详情
如何在模板驱动的表单中为 ngModelGroup 添加自定义验证
】如何在模板驱动的表单中为ngModelGroup添加自定义验证【英文标题】:HowtoaddcustomvalidationforngModelGroupinTemplatedrivenforms【发布时间】:2019-02-1502:19:15【问题描述】:我正在使用模板驱动的表单方法。我想在ngModelGroup上添加自定义验... 查看详情
Angular 2.0 中的模型驱动表单验证问题
】Angular2.0中的模型驱动表单验证问题【英文标题】:ModeldrivenformvalidationissueinAngular2.0【发布时间】:2017-09-1700:10:49【问题描述】:在Angular2.0中,我有使用FormBuilder的模型驱动表单,ngOnInit()this.user=this.fb.group(id:[\'\',[Validators.require... 查看详情
Angular2嵌套模板驱动表单
】Angular2嵌套模板驱动表单【英文标题】:Angular2nestedtemplatedrivenform【发布时间】:2017-01-0714:35:25【问题描述】:这简直是疯了,看起来没有办法让其中一个输入位于子组件中的表单。我已经阅读了所有的博客和教程以及所有内... 查看详情
模板中的自定义表单验证错误
】模板中的自定义表单验证错误【英文标题】:customformvalidationerrorsintemplate【发布时间】:2020-07-2513:40:12【问题描述】:如何在模板中传递自定义表单验证错误?forms.pydefclean_username(self):inputusername=self.cleaned_data[\'username\']iflen(inpu... 查看详情
Django:模板中的 Crispy 表单验证错误
】Django:模板中的Crispy表单验证错误【英文标题】:Django:CrispyFormsValidationErrorinTemplate【发布时间】:2021-02-1107:43:10【问题描述】:我正在使用django-crispy-forms来呈现精美的表单。对于我的一个表单,我必须进行一些自定义调整,... 查看详情
angular自定义验证器添加入模板驱动表单
创建自定义验证器的命令nggeneratedirectiveforbidden-name(自定义床啊金验证器的名称)生成的文件内容import{Directive}from'@angular/core';@Directive({selector:'[appForbiddenName]'})exportclassForbiddenNameDirective{const 查看详情
模板驱动表单(实验部分)
#模板驱动表单验证(template-drivenformvalidation)实现思路1.引入FormsModule2.应用NgForm和ngModel(关联class的属性)3.验证4.给出提示5.提交(Submit)#实现知识点在login.component.ts中<form#f="ngForm"class="login-form">//创建模板引用变量实现双... 查看详情
验证模板表单中的复选框列表(不是反应式表单)Angular 2
】验证模板表单中的复选框列表(不是反应式表单)Angular2【英文标题】:ValidationofCheckboxlistinTemplateform(notReactiveforms)Angular2【发布时间】:2018-01-2320:25:15【问题描述】:如何验证是否从Angular2模板表单中的复选框列表中选择了至... 查看详情
Angular 2中的模板驱动形式和反应形式有啥区别
】Angular2中的模板驱动形式和反应形式有啥区别【英文标题】:Whatarethedifferencesbetweentemplatedrivenformsandreactiveformsinangular2Angular2中的模板驱动形式和反应形式有什么区别【发布时间】:2017-12-2920:03:27【问题描述】:在Angular2中,模... 查看详情
模板驱动表单和使用服务的响应式表单之间的区别
】模板驱动表单和使用服务的响应式表单之间的区别【英文标题】:DifferencebetweenTemplateDrivenFormandReactiveFormusingaservice【发布时间】:2019-11-0713:50:50【问题描述】:我想知道什么时候应该使用模板驱动表单而不是响应式表单。我知... 查看详情
带有 ngFor 输入的 Angular 2 模板驱动表单
】带有ngFor输入的Angular2模板驱动表单【英文标题】:Angular2templatedrivenformwithngForinputs【发布时间】:2017-01-2915:48:06【问题描述】:是否可以在模板驱动的表单中使用ngFor创建输入字段,并使用#name="ngModel"之类的东西来在另一个标... 查看详情
template-drivenforms
Angular4.x中有两种表单:Template-DrivenForms-模板驱动式表单(类似于AngularJS1.x中的表单)ReactiveForms-响应式表单本文主要介绍Template-DrivenForms(模板驱动式表单),将涉及 ngForm、ngModel、ngModelGroup、表单提交事件、表单验证和异常信息... 查看详情
如何在 Angular 中将此模板驱动的表单更改为反应式表单?
】如何在Angular中将此模板驱动的表单更改为反应式表单?【英文标题】:HowtochangethistemplatedrivenformtoReactiveforminAngular?【发布时间】:2022-01-2309:43:36【问题描述】:如何将此模板驱动的表单更改为响应式表单?我想将此模板驱动... 查看详情
表单验证不适用于 Ionic 2 中的 Angular 2 FormBuilder
...稿)应用程序。在复选框(ion-checkbox标记)中的简单模型驱动表单验证中遇到问题ONLY。我正在使用FormBuilder来构建表单模块 查看详情
angular2+折腾记:初步了解表单:模板驱动及数据驱动及脱坑要点
...ctiveFormsModule}from‘@angular/forms‘;表单控件响应的几种状态模板驱动表单依赖FormsModule,数据驱动的表单依赖FormsModule,ReactiveFormsModule一般做表单校验及操作推荐用数据驱 查看详情