1

Soo, I need this form to work. But everytime I run my angular aplication, it shows only a blank page. this the page where the form is suposet to appear

The funny thing is, whenever I edit this line <form [formGroup]="registerForm" (ngSubmit)="onSubmit()"> an leave it like this <form (ngSubmit)="onSubmit()">, the form appears, but the registration button doesn't work.

Here's my HTML form:

<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>

My 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;
                });
    }
}
1
  • Could you create a codesanbox or something like that? Commented Jul 1, 2020 at 23:39

4 Answers 4

1

Put *ngIf="registerForm" on the form so the form doesn't try and render before the form group is constructed.

Sign up to request clarification or add additional context in comments.

Comments

0

If there is an error with your code, such as the formControlNames mentioned above, you may get a blank screen. Hit F12 in Chrome to see what is failing at runtime. For instance, in copying your code I didn't realize you were using router and did not install that. It failed when creating the component and had a blank screen. F12 showed the culprit.

Comments

0

Sooo, I added these things you guys told me, and then this is what happened :/ The form vanished and half of what was written on the footer. The form vanished and half of what was written on the footer.

This is the new code:

<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>

I'm not sure of what to do anymore :/

Comments

0

You missed the formControlName tags for each input element.

<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>

BASED IN YOUR LAST COMMENT:

Keep the [formGroup] tag in the form (the *ngIf is not necessary).

<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>

Also, take a look at your signup.component.ts, because you are using a bday control, and is not in your form declaration...

Should be something like this:

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

3 Comments

That's the problem :/ when I put the [formGroup], the page becomes completely white.
The formGroup directive must be there, it's the way to bind an existing FormGroup to a DOM element. Are you getting any error in the developer console?
Did you import FormsModule and ReactiveFormsModule in the module.ts? I created a stackblitz project with your code and it works for me: stackblitz.com/edit/angular-ivy-lwdr8q

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.