forms - 表单控件未定义

标签 forms angular

我的表格是按以下方式制作的:

<form #form="ngForm" novalidate (ngSubmit)="register(form);">
    <div class="registerinput">
        <label for="firstname">First Name</label>
        <input #firstname="ngModel" type="text" name="firstname" maxlength="30" pattern="[a-zA-Z ]*" required ngModel>
        <div [hidden]="!form.controls.firstname.touched && !form.controls.firstname.errors?.required" class="alert-danger">
            Please enter your name
        </div>
        <div [hidden]="!form.controls.firstname.touched && !form.controls.firstname.errors?.maxlength" class="alert-danger">
             Max length is 30 characters
        </div>
        <div [hidden]="!form.controls.firstname.touched && !form.controls.firstname.errors?.pattern" class="alert-danger">
             Only letters are allowed
        </div>
    </div>
    <div class="registerinput">
        <button type="submit" class="btn-register">Register</button>
    </div>
</form>

我收到以下错误:

EXCEPTION: Uncaught (in promise): Error: Error in http://localhost:3000/app/register/register.component.html:7:17 caused by: Cannot read property 'touched' of undefined
Error: Error in http://localhost:3000/app/register/register.component.html:7:17 caused by: Cannot read property 'touched' of undefined

它似乎找不到我的控件。但是,当我尝试打印 form.controls 时,我得到以下结果:

enter image description here

所以在这种情况下,它发现它们很好。这里有什么问题?我过去做过类似的东西。

更新:我发现我必须使用 firstname.touched 来访问它们,而不是例如 form.controls.firstname.touched。我只是不明白为什么,因为我在同一个项目中有另一个文件,我在其中使用以完全相同的方式制作的表单,但在那个文件中我使用的是 form.controls.*。我猜你可以使用 firstname.touched 如果你已经声明了一个模板引用变量,但我不知道在什么情况下你可以使用 form.controls.*.

最佳答案

另一种验证方式是:

<form #form="ngForm" novalidate (ngSubmit)="register(form);">
    <div class="registerinput">
        <label for="firstname">First Name</label>
        <input #firstname="ngModel" type="text" name="firstname" maxlength="30" pattern="[a-zA-Z ]*" required ngModel>
        <div [hidden]="!firstname.touched && !firstname.errors?.required" class="alert-danger">
            Please enter your name
        </div>
        <div [hidden]="!firstname.touched && !firstname.errors?.maxlength" class="alert-danger">
             Max length is 30 characters
        </div>
        <div [hidden]="!firstname.touched && !firstname.errors?.pattern" class="alert-danger">
             Only letters are allowed
        </div>
    </div>
    <div class="registerinput">
        <button type="submit" class="btn-register" [disabled]='!form.valid'>Register</button>
    </div>
</form>

这是一种非常简单易行的方法。

关于forms - 表单控件未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121074/

相关文章:

php - 根据 mysql 数据库项目的选择禁用输入字段

html - 将星号添加到 <label> 的末尾

javascript - jQuery 验证插件 - 无法在 Safari 中工作

javascript - 使用填充样式设置 HTML FORM 元素,宽度为 100%

Angular 4 Multiple Guards - 执行顺序

php - 如何在连续提交表单后保留变量的值

javascript - 与数组变量绑定(bind)时,IonSelect 和 ionCheckBox 不起作用

javascript - Angular 2 : Set change attribute for select in Typescript

validation - 如何在 Angular4 中实现自定义异步验证器

image - angular2显示base64图片