You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular登录表单submit按钮与required属性失效问题求助

问题:Angular登录表单的required验证与submit按钮失效

正在为朋友开发小型网站的管理员登录页面,技术栈为Html、Css、Angular、TypeScript,搭配Bootstrap和swiper库。但表单的required验证属性和submit按钮无法正常工作,无法定位原因,以下是相关代码:

TypeScript代码

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthappService } from '../services/authapp.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
  public postaE: string = "";
  public pwd: string = "";

  public nonAutenticato: boolean = false;
  public errMsg: string = "Spiacenti, posta elettronica o parola d'ordine errati."

  constructor(private route: Router, private authAdminTemp: AuthappService) { }

  ngOnInit(): void {
  }

   loginAdmin = () : void => {
    console.log(this.postaE);
    console.log(this.pwd);

    if(this.authAdminTemp.autenticazioneTemp(this.postaE, this.pwd)) {
      this.route.navigate(['admin', this.postaE]);
      this.nonAutenticato = true;
    } else {
      this.nonAutenticato = false;
    }
  } 
}

CSS代码

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');

main {
    display: grid;
    height: 100vh;
    width: 100%;
    place-items: center;
    background: linear-gradient(to right, #99004d 0%, #ff0080 100%);
}

::selection {
    background: #ff80bf;

}

.container {
    background: #fff;
    max-width: 350px;
    width: 100%;
    padding: 25px 30px;
    border-radius: 5px;
    box-shadow: 0 10px 10px rgba(0, 0, 0, 0.15);
}

.container form .title {
    font-size: 30px;
    font-weight: 600;
    margin: 20px 0 10px 0;
    position: relative;
}

.container form .title:before {
    content: '';
    position: absolute;
    height: 4px;
    width: 33px;
    left: 0px;
    bottom: 3px;
    border-radius: 5px;
    background: linear-gradient(to right, #99004d 0%, #ff0080 100%);
}

.container form .input-box {
    width: 100%;
    height: 45px;
    margin-top: 25px;
    position: relative;
}

.container form .input-box input {
    width: 100%;
    height: 100%;
    outline: none;
    font-size: 16px;
    border: none;
}

.container form .underline::before {
    content: '';
    position: absolute;
    height: 2px;
    width: 100%;
    background: #ccc;
    left: 0;
    bottom: 0;
}

.container form .underline::after {
    content: '';
    position: absolute;
    height: 2px;
    width: 100%;
    background: linear-gradient(to right, #99004d 0%, #ff0080 100%);
    left: 0;
    bottom: 0;
    transform: scaleX(0);
    transform-origin: left;
    transition: all 0.3s ease;
}

.container form .input-box input:focus~.underline::after,
.container form .input-box input:valid~.underline::after {
    transform: scaleX(1);
    transform-origin: left;
}

.container form .button {
    margin: 40px 0 20px 0;
}

.container .input-box input[type="submit"] {
    background: linear-gradient(to right, #99004d 0%, #ff0080 100%);
    font-size: 17px;
    color: #fff;
    border-radius: 5px;
    cursor: pointer;
    transition: all 0.3s ease;
}

.container .input-box input[type="submit"]:hover {
    letter-spacing: 1px;
    background: linear-gradient(to left, #99004d 0%, #ff0080 100%);
}

.ForgetPwd {
    color: black;
    text-decoration: none;
}

.ForgetPwd:hover {
    letter-spacing: 1px;
}

HTML代码

<main>
  <div class="container">
      <form action="" method="POST"> <!-- Imposto il metodo di trasferimento e l'azione svolta -->
          <div class="title">Accesso amministratore - Bentornato</div>
          <div class="input-box underline">
              <input type="text" name="username" [(ngModel)]="postaE" placeholder="Posta elettronica..." required>
              <div class="underline"></div>
          </div>
          <div class="input-box">
              <input type="password" name="password" [(ngModel)]="pwd" placeholder="Chiave di accesso..." required>
              <div class="underline"></div>
          </div>
          <div class="form-group">
              <a href="#" class="ForgetPwd">Parola chiave dimenticata?</a>
          </div>
          <div class="input-box button">
              <input type="submit" name="accedi" (click)="loginAdmin()" value="Continua">
          </div>
      </form>
  </div>
  <div class="alert alert-danger" role="alert" *ngIf='nonAutenticato'>
    {{errMsg}}
  </div>
</main>

问题原因及解决方法

1. 表单事件绑定错误,绕过原生验证

当前用(click)绑定submit按钮的点击事件,会直接触发loginAdmin方法,跳过浏览器原生的required校验。需要改用Angular的表单提交事件(ngSubmit),并结合模板驱动表单的NgForm来触发验证:

  • 修改form标签:添加#loginForm="ngForm"和(ngSubmit)="loginAdmin()",移除action="" method="POST"(Angular单页应用不需要原生表单提交)
  • 修改submit按钮:移除(click)绑定,保留type="submit"

修改后的form部分:

<form #loginForm="ngForm" (ngSubmit)="loginAdmin()">
  <!-- 表单内容不变 -->
  <div class="input-box button">
      <input type="submit" name="accedi" value="Continua">
  </div>
</form>

2. 未导入FormsModule,导致ngModel和NgForm失效

在你的组件所属的模块(比如AppModule)中,需要导入FormsModule,否则模板驱动表单的指令无法生效:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms'; // 导入FormsModule

import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    FormsModule // 添加到imports数组
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

3. HTML中引入了错误的AngularJS脚本

你的HTML里引入了<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>,这是AngularJS(1.x版本)的脚本,而你用的是Angular(2+),两者不兼容,直接删除这行代码即可。

4. 登录逻辑中的状态赋值错误

loginAdmin方法里的nonAutenticato赋值逻辑反了:验证通过时应该隐藏错误提示(设为false),验证失败时显示(设为true),修正后:

loginAdmin = () : void => {
  console.log(this.postaE);
  console.log(this.pwd);

  if(this.authAdminTemp.autenticazioneTemp(this.postaE, this.pwd)) {
    this.route.navigate(['admin', this.postaE]);
    this.nonAutenticato = false; // 验证通过,隐藏错误
  } else {
    this.nonAutenticato = true; // 验证失败,显示错误
  }
} 

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:13