Angular 子表单字段验证
Angular child form field validation
我有一些现有代码的结构大致如下:
<!-- my-form.html -->
<form ngNativeValidate>
<my-other-component></my-other-component>
<button mat-button type='submit'>Submit</button>
</form>
<!-- my-other-component.html -->
<input name='native-input' required />
<mat-form-field>
<mat-select name='balls' required>
<mat-option value='a'>a</mat-option>
<mat-option value='b'>b</mat-option>
<mat-option value='c'>c</mat-option>
</mat-select>
</mat-form-field>
问题:当本机输入被正确验证时——浏览器在需要时在提交时显示 "Please fill out this field." 提示——很高兴地接受 balls
的空输入。
仅在提交时显示 generic/non-descriptive 错误的 ngNativeValidate
行为目前没问题,我们没有时间将所有内容转换为带有自定义验证消息的 Angular 表单,所以这不是一个选择。我正在寻找的是一种从本机验证切换到 Angular 验证的方法,以尽可能少的努力来维护可接受的用户体验——例如简单地禁用提交按钮,直到表单输入有效。
根据 angular.io/guide/form-validation,我看到我可以将 ngNativeValidate
更改为 #myForm='ngForm'
并将 [disabled]='myForm.invalid'
添加到提交按钮。但是,此验证仅适用于直接在 my-form.html 中的表单字段,不适用于 my-other-component
.
中的表单字段
这里的文档真的很少,所以我不确定接下来要尝试什么。有谁知道是否可以配置 ngForm
来验证那些后代组件的表单字段?
如果您想使用模板驱动的表单方法,那么您必须将 FormsModule
导入您的 @NgModule
并将 NgModel
指令应用于所有控件
<input name='native-input' ngModel required />
^^^^^^^
<mat-form-field>
<mat-select name='balls' ngModel required>
^^^^^^^
<mat-option value='a'>a</mat-option>
<mat-option value='b'>b</mat-option>
<mat-option value='c'>c</mat-option>
</mat-select>
</mat-form-field>
现在你的子组件应该知道父表单了。为此,您需要在 viewProviders
数组中提供 ControlContainer
令牌:
@Component({
selector: 'my-other-component',
template: `
...
`,
viewProviders: [ { provide: ControlContainer, useExisting: NgForm } ]
})
export class MyOtherComponent {
另请参阅:
- Angular2 nested template driven form
我有一些现有代码的结构大致如下:
<!-- my-form.html -->
<form ngNativeValidate>
<my-other-component></my-other-component>
<button mat-button type='submit'>Submit</button>
</form>
<!-- my-other-component.html -->
<input name='native-input' required />
<mat-form-field>
<mat-select name='balls' required>
<mat-option value='a'>a</mat-option>
<mat-option value='b'>b</mat-option>
<mat-option value='c'>c</mat-option>
</mat-select>
</mat-form-field>
问题:当本机输入被正确验证时——浏览器在需要时在提交时显示 "Please fill out this field." 提示——很高兴地接受 balls
的空输入。
仅在提交时显示 generic/non-descriptive 错误的 ngNativeValidate
行为目前没问题,我们没有时间将所有内容转换为带有自定义验证消息的 Angular 表单,所以这不是一个选择。我正在寻找的是一种从本机验证切换到 Angular 验证的方法,以尽可能少的努力来维护可接受的用户体验——例如简单地禁用提交按钮,直到表单输入有效。
根据 angular.io/guide/form-validation,我看到我可以将 ngNativeValidate
更改为 #myForm='ngForm'
并将 [disabled]='myForm.invalid'
添加到提交按钮。但是,此验证仅适用于直接在 my-form.html 中的表单字段,不适用于 my-other-component
.
这里的文档真的很少,所以我不确定接下来要尝试什么。有谁知道是否可以配置 ngForm
来验证那些后代组件的表单字段?
如果您想使用模板驱动的表单方法,那么您必须将 FormsModule
导入您的 @NgModule
并将 NgModel
指令应用于所有控件
<input name='native-input' ngModel required />
^^^^^^^
<mat-form-field>
<mat-select name='balls' ngModel required>
^^^^^^^
<mat-option value='a'>a</mat-option>
<mat-option value='b'>b</mat-option>
<mat-option value='c'>c</mat-option>
</mat-select>
</mat-form-field>
现在你的子组件应该知道父表单了。为此,您需要在 viewProviders
数组中提供 ControlContainer
令牌:
@Component({
selector: 'my-other-component',
template: `
...
`,
viewProviders: [ { provide: ControlContainer, useExisting: NgForm } ]
})
export class MyOtherComponent {
另请参阅:
- Angular2 nested template driven form