【问题标题】:My form doesn't work, I'm using Angular + HTML + Typescript我的表单不起作用,我正在使用 Angular + HTML + Typescript
【发布时间】:2020-10-22 11:31:37
【问题描述】:

所以,我需要这个表格才能工作。但是每次我运行我的角度应用程序时,它只显示一个空白页。 this the page where the form is suposet to appear

有趣的是,每当我编辑这行 <form [formGroup]="registerForm" (ngSubmit)="onSubmit()"> 并保持这样的 <form (ngSubmit)="onSubmit()"> 时,表单会出现,但注册按钮不起作用。

这是我的 HTML 表单:

<div class="wrapper">
    <div class="page-header" style="background-image: url('./assets/img/login-image.jpg');">
        <div class="filter"></div>
            <div class="container">
                <div class="row">
                    <div class="col-lg-4 col-sm-6 mr-auto ml-auto">
                      <div class="card card-register">
                            <h3 class="title">Registre-se na MPG!</h3>
                            <form [formGroup]="registerForm" (ngSubmit)="onSubmit()">
                                <label for="firstName">Nome</label>
                                <div class="input-group form-group-no-border">
                                <div class="input-group-prepend">
                                </div>
                                <input type="text" id="firstName" class="form-control" placeholder="Nome" (focus)="focus=true" (blur)="focus=false" [ngClass]="{ 'is-invalid': submitted && f.firstName.errors }" />
                            </div>
                            <div *ngIf="submitted && f.firstName.errors" class="invalid-feedback">
                                <div *ngIf="f.firstName.errors.required">O primeiro nome é obrigatório.</div>
                            </div>
                            <label for="lastName">Sobrenome</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                <div class="input-group-prepend">
                                </div>
                                    <input type="text" id="lastName" class="form-control" placeholder="Sobrenome" (focus)="focus=true" (blur)="focus=false">
                                </div>
                                <div *ngIf="submitted && f.lastName.errors" class="invalid-feedback">
                                <div *ngIf="f.lastName.errors.required">O sobrenome é obrigatório.</div>
                            </div>

                            <label for="bday">Data de Nascimento</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                <div class="input-group-prepend">
                                </div>
                                    <input type="date" id="bday" class="form-control" (focus)="focus=true" (blur)="focus=false">
                                </div>
                                <div *ngIf="submitted && f.bday.errors" class="invalid-feedback">
                                <div *ngIf="f.bday.errors.required">A data de nascimento é obrigatório.</div>
                            </div>
                            <label for="email">Email</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                              <div class="input-group-prepend">
                                <span class="input-group-text">
                                    <i class="nc-icon nc-email-85"></i>
                                </span>
                              </div>
                            <input type="text" id="email" class="form-control" placeholder="Email" (focus)="focus=true" (blur)="focus=false" >
                            <div *ngIf="submitted && f.email.errors" class="invalid-feedback">
                              <div *ngIf="f.email.errors.required">O e-mail é obrigatório.</div>
                          </div>
                          </div>

                            <label for="password">Senha</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus1===true}">
                              <div class="input-group-prepend">
                                <span class="input-group-text">
                                    <i class="nc-icon nc-key-25"></i>
                                </span>
                              </div>
                                <input type="password" id="password" class="form-control" placeholder="Senha" (focus)="focus1=true" (blur)="focus1=false" >
                            </div>
                            <div *ngIf="submitted && f.password.errors" class="invalid-feedback">
                              <div *ngIf="f.password.errors.required">Uma senha é obrigatória.</div>
                              <div *ngIf="f.password.errors.minlength">A senha deve possuir no mínimo 6 caracteres.</div>
                          </div>
                          <button type="submit" [disabled]="loading" class="btn btn-danger btn-block btn-round">
                              <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span>
                              Registre-se
                          </button>
                          </form>
                          
                          <div class="forgot">
                              <a href="#" class="btn btn-link btn-danger">Esqueceu sua senha?</a>
                          </div>
                      </div>
                    </div>
                </div>
                <div class="footer register-footer text-center">
                    <h6>&copy;{{test | date: 'yyyy'}}, feito com <i class="fa fa-heart heart"></i> pela MPG</h6>
                </div>
            </div>
    </div>
</div>

我的 signup.component.ts:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms';
import { first } from 'rxjs/operators';

import { AlertService, UserService, AuthenticationService } from 'app/components/services';

@Component({
    selector: 'app-signup',
    templateUrl: './signup.component.html',
    styleUrls: ['./signup.component.scss']
})
export class SignupComponent implements OnInit {
    test : Date = new Date();
    focus;
    focus1;
    registerForm: FormGroup;
    loading = false;
    submitted = false;

    constructor(
        private formBuilder: FormBuilder,
        private router: Router,
        private authenticationService: AuthenticationService,
        private userService: UserService,
        private alertService: AlertService
    ) {
        // redirect to home if already logged in
        if (this.authenticationService.currentUserValue) {
            this.router.navigate(['/']);
        }
    }
    ngOnInit() {
        this.registerForm = this.formBuilder.group({
            firstName: ['', Validators.required],
            lastName: ['', Validators.required],
            email: ['', Validators.required],
            password: ['', [Validators.required, Validators.minLength(6)]]
        });
    }

    // convenience getter for easy access to form fields
    get f() { return this.registerForm.controls; }

    onSubmit() {
        this.submitted = true;

        // reset alerts on submit
        this.alertService.clear();

        // stop here if form is invalid
        if (this.registerForm.invalid) {
            return;
        }

        this.loading = true;
        this.userService.register(this.registerForm.value)
            .pipe(first())
            .subscribe(
                data => {
                    this.alertService.success('Registro feito com sucesso!', true);
                    this.router.navigate(['/login']);
                },
                error => {
                    this.alertService.error(error);
                    this.loading = false;
                });
    }
}

【问题讨论】:

  • 你能创建一个codesanbox或类似的东西吗?

标签: html css angular typescript forms


【解决方案1】:

您错过了每个输入元素的 formControlName 标签。

<label for="firstName">Nome</label>
<div class="input-group form-group-no-border">
    <div class="input-group-prepend"></div>
    <input formControlName="firstName" type="text" id="firstName" class="form-control" placeholder="Nome" (focus)="focus=true" (blur)="focus=false" [ngClass]="{ 'is-invalid': submitted && f.firstName.errors }" />
</div>

基于您的最后评论:

在表单中保留 [formGroup] 标签(*ngIf 不是必需的)。

<div class="wrapper">
    <div class="page-header" style="background-image: url('./assets/img/login-image.jpg');">
        <div class="filter"></div>
        <div class="container">
            <div class="row">
                <div class="col-lg-4 col-sm-6 mr-auto ml-auto">
                    <div class="card card-register">
                        <h3 class="title">Registre-se na MPG!</h3>
                        <form [formGroup]="registerForm" (ngSubmit)="onSubmit()">
                            <label for="firstName">Nome</label>
                            <div class="input-group form-group-no-border">
                                <div class="input-group-prepend"></div>
                                <input formControlName="firstName" type="text" class="form-control" placeholder="Nome" (focus)="focus=true" (blur)="focus=false" [ngClass]="{ 'is-invalid': submitted && f.firstName.errors }" />
                            </div>
                            <div *ngIf="submitted && f.firstName.errors" class="invalid-feedback">
                                <div *ngIf="f.firstName.errors.required">O primeiro nome é obrigatório.</div>
                            </div>
                            
                            <label for="lastName">Sobrenome</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                <div class="input-group-prepend"></div>
                                <input formControlName="lastName" type="text" class="form-control" placeholder="Sobrenome" (focus)="focus=true" (blur)="focus=false">
                            </div>
                            <div *ngIf="submitted && f.lastName.errors" class="invalid-feedback">
                                <div *ngIf="f.lastName.errors.required">O sobrenome é obrigatório.</div>
                            </div>
                            
                            <label for="bday">Data de Nascimento</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                <div class="input-group-prepend"></div>
                                <input formControlName="bday" type="date" class="form-control" (focus)="focus=true" (blur)="focus=false">
                            </div>
                            <div *ngIf="submitted && f.bday.errors" class="invalid-feedback">
                                <div *ngIf="f.bday.errors.required">A data de nascimento é obrigatório.</div>
                            </div>
                            
                            <label for="email">Email</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                <div class="input-group-prepend">
                                    <span class="input-group-text">
                                        <i class="nc-icon nc-email-85"></i>
                                    </span>
                                </div>
                                <input formControlName="email" type="text" class="form-control" placeholder="Email" (focus)="focus=true" (blur)="focus=false" >
                            </div>
                            <div *ngIf="submitted && f.email.errors" class="invalid-feedback">
                                <div *ngIf="f.email.errors.required">O e-mail é obrigatório.</div>
                            </div>
                            
                            <label for="password">Senha</label>
                            <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus1===true}">
                                <div class="input-group-prepend">
                                    <span class="input-group-text">
                                        <i class="nc-icon nc-key-25"></i>
                                    </span>
                                </div>
                                <input formControlName="password" type="password" class="form-control" placeholder="Senha" (focus)="focus1=true" (blur)="focus1=false" >
                            </div>
                            <div *ngIf="submitted && f.password.errors" class="invalid-feedback">
                                <div *ngIf="f.password.errors.required">Uma senha é obrigatória.</div>
                                <div *ngIf="f.password.errors.minlength">A senha deve possuir no mínimo 6 caracteres.</div>
                            </div>
                            
                            <button type="submit" [disabled]="loading" class="btn btn-danger btn-block btn-round">
                                <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span>
                                Registre-se
                            </button>
                        </form>
                        
                        <div class="forgot">
                            <a href="#" class="btn btn-link btn-danger">Voltar</a>
                        </div>
                    </div>
                </div>
            </div>
            
            <div class="footer register-footer text-center">
                <h6>{{test | date: 'yyyy'}}, feito com <i class="fa fa-heart heart"></i> pela MPG</h6>
            </div>
        </div>
    </div>
</div>

另外,请查看您的 signup.component.ts,因为您使用的是 bday 控件,并且不在您的表单声明中... p>

应该是这样的:

this.registerForm = this.formBuilder.group({
    firstName: ['', Validators.required],
    lastName: ['', Validators.required],
    email: ['', Validators.required],
    password: ['', [Validators.required, Validators.minLength(6)]],
    bday: ['', Validadors.required]
});

【讨论】:

  • 这就是问题所在:/当我放[formGroup]时,页面变成了全白。
  • 必须有 formGroup 指令,这是将现有 FormGroup 绑定到 DOM 元素的方法。您是否在开发者控制台中遇到任何错误?
  • 你在module.ts中导入FormsModule和ReactiveFormsModule了吗?我用你的代码创建了一个 stackblitz 项目,它对我有用:stackblitz.com/edit/angular-ivy-lwdr8q
【解决方案2】:

Sooo,我添加了你们告诉我的这些内容,然后发生了这样的事情:/ 表格消失了,页脚上写了一半。

这是新代码:

<div class="wrapper">
    <div class="page-header" style="background-image: url('./assets/img/login-image.jpg');">
        <div class="filter"></div>
            <div class="container">
                <div class="row">
                    <div class="col-lg-4 col-sm-6 mr-auto ml-auto">
                        <div class="card card-register">
                            <h3 class="title">Registre-se na MPG!</h3>
                            <form *ngIf="registerForm" (ngSubmit)="onSubmit()">
                                
                                <label for="firstName">Nome</label>
                                <div class="input-group form-group-no-border">
                                    <div class="input-group-prepend"></div>
                                    <input formControlName="firstName" type="text" class="form-control" placeholder="Nome" (focus)="focus=true" (blur)="focus=false" [ngClass]="{ 'is-invalid': submitted && f.firstName.errors }" />
                                </div>
                                    <div *ngIf="submitted && f.firstName.errors" class="invalid-feedback">
                                    <div *ngIf="f.firstName.errors.required">O primeiro nome é obrigatório.</div>
                                </div>
                                
                                <label for="lastName">Sobrenome</label>
                                <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                    <div class="input-group-prepend"></div>
                                    <input formControlName="lastName" type="text" class="form-control" placeholder="Sobrenome" (focus)="focus=true" (blur)="focus=false">
                                </div>
                                    <div *ngIf="submitted && f.lastName.errors" class="invalid-feedback">
                                    <div *ngIf="f.lastName.errors.required">O sobrenome é obrigatório.</div>
                                </div>

                                <label for="bday">Data de Nascimento</label>
                                <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                    <div class="input-group-prepend"></div>
                                    <input formControlName="bday" type="date" class="form-control" (focus)="focus=true" (blur)="focus=false">
                                </div>
                                    <div *ngIf="submitted && f.bday.errors" class="invalid-feedback">
                                    <div *ngIf="f.bday.errors.required">A data de nascimento é obrigatório.</div>
                                </div>

                                <label for="email">Email</label>
                                <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus===true}">
                                    <div class="input-group-prepend">
                                    <span class="input-group-text">
                                        <i class="nc-icon nc-email-85"></i>
                                    </span>
                                </div>
                                    <input formControlName="email" type="text" class="form-control" placeholder="Email" (focus)="focus=true" (blur)="focus=false" >
                                </div>
                                    <div *ngIf="submitted && f.email.errors" class="invalid-feedback">
                                    <div *ngIf="f.email.errors.required">O e-mail é obrigatório.</div>
                                </div>
                                
                                <label for="password">Senha</label>
                                <div class="input-group form-group-no-border" [ngClass]="{'input-group-focus':focus1===true}">
                                    <div class="input-group-prepend">
                                    <span class="input-group-text">
                                        <i class="nc-icon nc-key-25"></i>
                                    </span>
                                </div>
                                    <input formControlName="password" type="password" class="form-control" placeholder="Senha" (focus)="focus1=true" (blur)="focus1=false" >
                                </div>
                                    <div *ngIf="submitted && f.password.errors" class="invalid-feedback">
                                    <div *ngIf="f.password.errors.required">Uma senha é obrigatória.</div>
                                    <div *ngIf="f.password.errors.minlength">A senha deve possuir no mínimo 6 caracteres.</div>
                                </div>
                                
                                <button type="submit" [disabled]="loading" class="btn btn-danger btn-block btn-round">
                                    <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span>
                                        Registre-se
                                </button>
                            </form>
                          
                            <div class="forgot">
                                <a href="#" class="btn btn-link btn-danger">Voltar</a>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="footer register-footer text-center">
                    <h6>{{test | date: 'yyyy'}}, feito com <i class="fa fa-heart heart"></i> pela MPG</h6>
                </div>
            </div>
    </div>
</div>

我不知道该做什么了:/

【讨论】:

    【解决方案3】:

    如果您的代码有错误,例如上面提到的 formControlNames,您可能会得到一个空白屏幕。在 Chrome 中按 F12 以查看运行时失败的原因。例如,在复制您的代码时,我没有意识到您正在使用路由器并且没有安装它。创建组件时失败并出现空白屏幕。 F12 显示了罪魁祸首。

    【讨论】:

      【解决方案4】:

      *ngIf="registerForm" 放在表单上,​​这样表单就不会在构造表单组之前尝试渲染。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2023-01-11
        • 2015-03-10
        相关资源
        最近更新 更多