Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

ngForm não desabilita o botão de acesso

Boa tarde. Por alguma razão, quando passo o comando do [disabled]="loginForm.invalid" não desabilita o botão

<div class="account-pages my-5 pt-sm-5">
  <div class="container">
    <div class="row justify-content-center">
      <div class="col-md-8 col-lg-6 col-xl-5">
        <div class="card overflow-hidden">
          <div class="bg-soft bg-primary">
            <div class="row">
              <div class="col-7">
                <div class="text-primary p-4">
                  <h5 class="text-primary">Bem Vindo(a)</h5>
                  <p>Acesso ao CRM Royale</p>
                </div>
              </div>
              <div class="col-5 align-self-end">
                <img src="assets/images/profile-img.png" alt="" class="img-fluid">
              </div>
            </div>
          </div>
          <div class="card-body pt-0">
            <div>
              <a routerLink="/">
                <div class="avatar-md profile-user-wid mb-4">
                  <span class="avatar-title rounded-circle bg-light">
                    <img src="assets/images/logo.svg" alt="" class="rounded-circle" height="34">
                  </span>
                </div>
              </a>
            </div>
            <div class="p-2">
              <form class="form-horizontal" (ngSubmit)="login()" #loginForm="ngForm">

                <div class="mb-3">
                  <label for="email">Email</label>
                  <input type="email" #campoEmail="ngModel" required [(ngModel)]="usuario" [ngModelOptions]="{standalone: true}"  class="form-control" id="email" placeholder="Email"/>

                  <app-mensagem
                  *ngIf="campoEmail.invalid && campoEmail.touched" mensagem="Usuário Obrigatório"></app-mensagem>
                </div>

                <div class="mb-3">
                  <label for="password">Senha</label>
                  <div class="input-group auth-pass-inputgroup">
                    <input type="password"  #campoSenha="ngModel" required class="form-control" [(ngModel)]="senha" [ngModelOptions]="{standalone: true}" placeholder="Enter password"/>


                    <button class="btn btn-light ms-0" type="button" id="password-addon"><i
                        class="mdi mdi-eye-outline"></i></button>

                  </div>
                  <app-mensagem *ngIf="campoSenha.invalid && campoSenha.touched" mensagem="Senha Obrigatória"></app-mensagem>

                </div>

                <div class="form-check">
                  <input class="form-check-input" type="checkbox" id="remember-check">
                  <label class="form-check-label" for="remember-check">
                      Remember me
                  </label>
              </div>

                <div class="mt-3 d-grid">
                  <button class="btn btn-primary" type="submit" [disabled]="loginForm.invalid">Acessar</button>
                </div>

              </form>
            </div>

          </div>
        </div>
        <div class="mt-5 text-center">
          <p>© {{year}} Power by Will</p>
        </div>

      </div>
    </div>
  </div>

  <!-- end container -->
</div>
<!-- end page -->

Alguma sugestão?

3 respostas
solução!

Olá Willian, tudo bem?

Fiz alguns testes com seu arquivo html e acredito que o problema esteja relacionado ao uso da propriedade

[ngModelOptions]="{standalone: true}"

Essa configuração standalone, quando setada como true, está informando que o ngModel não se registrará junto com seu formulário pai e agirá como se não estivesse no formulário.

Em outras palavras, como você configurou essa propriedade verdadeira para o e-mail e a senha, é como se eles fossem campos com controle 'autônomo'. No final, para desabilitar o botão, você está verificando se o form está inválido, mas como esses campos estão independentes do form, ele sempre está válido e, por isso, o botão fica sempre habilitado.

Eu não sei qual o seu objetivo ao usar essa configuração mas, caso queira permanecer com ela, para desabilitar o botão, você pode validar os campos e não o formulário, assim:

<div class="mt-3 d-grid">
    <button class="btn btn-primary" type="submit" [disabled]="campoSenha.invalid && campoEmail.invalid">Acessar</button>
</div>

Espero ter ajudado, bons estudos!

Boa noite Nayanne, tudo bem e com você? Então, estou usando essa propriedade pois sem ela, o input apresenta erro, conforme segue.

core.mjs:6495 ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form
    control must be defined as 'standalone' in ngModelOptions.

    Example 1: <input [(ngModel)]="person.firstName" name="first">
    Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">
    at missingNameException (:4200/vendor.js:146832:10)
    at NgModel._checkName (:4200/vendor.js:147212:13)
    at NgModel._checkForErrors (:4200/vendor.js:147195:10)
    at NgModel.ngOnChanges (:4200/vendor.js:147114:10)
    at NgModel.rememberChangeHistoryAndInvokeOnChangesHook (:4200/vendor.js:103962:10)
    at callHook (:4200/vendor.js:105212:12)
    at callHooks (:4200/vendor.js:105155:9)
    at executeInitAndCheckHooks (:4200/vendor.js:105091:5)
    at selectIndexInternal (:4200/vendor.js:112124:9)
    at Module.ɵɵadvance (:4200/vendor.js:112100:3)

Mas realmente, realizando a validação individual dos campos, funcionaram perfeitamente. Obrigado

EDIT: Acabei verificando que esqueci a propriedade "name" dentro dos inputs, por isso apresentava esse erro. Ai então funcionou com a validação do form. Vivendo e aprendendo! haha Obrigado novamente.

Tudo joia Willian, fico feliz que tenha ajudado.

É isso mesmo, todo dia aprendendo algo novo e evoluindo!

Abraços e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software