【问题标题】:How to Validate Forms inside an ngb-accordion如何验证 ngb-accordion 中的表单
【发布时间】:2021-07-21 21:00:27
【问题描述】:

我已经实现了一个ngb-accordion,其中包含一个带有几个输入字段的表单。我想在表单有效时显示一个带有复选标记的图标(在这种情况下,当所有表单都只是填写而没有空字段时),而在所有其他情况下,它会显示一个“X”标记图标。这些图标出现在标题前面的 ngb-panel 标题中。

我为所有字段分配了必需的属性,组件文件中的一个方法检查表单是否有效。

SCSS 和 HTML 文件-

input[type="text"],
select.form-control{
  background: transparent;
  border: none;
  border-bottom: 1px solid #000000;
  -webkit-box-shadow: none;
  box-shadow: none;
  border-radius: 0;
}
input[type="number"],
select.form-control{
  background: transparent;
  border: none;
  border-bottom: 1px solid #000000;
  -webkit-box-shadow: none;
  box-shadow: none;
  border-radius: 0;
}
input[type="text"]:focus,
select.form-control:focus {
  -webkit-box-shadow: none;
  box-shadow: none;
  border-color:rgb(31, 14, 187);
}
input[type="number"]:focus,
select.form-control:focus {
  -webkit-box-shadow: none;
  box-shadow: none;
  border-color:darkred;
}
::ng-deep .collapse {
    transition: max-height .55s, opacity .35s ease-in-out;
    max-height: 0;
    opacity: 0;
    display: block !important;
  
    &.show {
      max-height: 100rem;
      opacity: 1;
    }
  }
  
  ::ng-deep .accordion {
    .card {
      margin-bottom: 0 !important;
      border-bottom: 1px solid rgba(0, 0, 0, .04) !important;
  
      .card-header {
        // padding-top: 0;
        color: #000000;
        padding: 0;
  
        button {
          padding: 1.2rem;
          width: 100%;
  
          span {
            float: left;
            font-size: 1.2rem;
          }
        }
      }
  
      .card-body {
        padding: 1rem;
      }
    }
  }
 <div class="card">
        <div class="card-body">
           <!-- ngb Accordion starts -->
           <ngb-accordion [destroyOnHide]='false' [closeOthers]="true">
            
              <ngb-panel id="panel3">
                 <ng-template ngbPanelTitle>
                     <span *ngIf=" !myFormIsInvalid()">   <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-x-circle" viewBox="0 0 16 16">
                        <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
                        <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"
                        style="color: red;border-color: red;"/>
                        
                      </svg>&nbsp;</span>
                      <span><svg *ngIf="myFormIsInvalid()" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" class="bi bi-check-circle" viewBox="0 0 16 16">
                        <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
                        <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" style="color: green;"/>
                      </svg>&nbsp;</span>
                    <span>More Details </span>
                 </ng-template>
                 <ng-template ngbPanelContent>
     
                    <form #form3="ngForm" style="padding-left:20px;">
                
                        <div class="form-group">
                            <label for="name" class="control-label">Email<sup style="color: red;font-size:medium;">*</sup></label>
                            <input type="text" required #email ngModel name="Email" class="form-control" id="email">
                          </div>
                          <div class="form-group">
                            <label for="name" class="control-label">Phone<sup style="color: red;font-size:medium;">*</sup></label>
                            <input type="number" #phone ngModel required name="Phone" class="form-control" id="pone">
                          </div>  
                         
                          </form> 
                 </ng-template>
              </ngb-panel>
              
           </ngb-accordion>
          
        </div>
     </div>
    

Typescript 组件文件-

import { Component, OnInit } from '@angular/core';
import { ViewChild } from '@angular/core'
import { NgForm }   from '@angular/forms';

@Component({
  selector: 'app-collapsedemo',
  templateUrl: './collapsedemo.component.html',
  styleUrls: ['./collapsedemo.component.scss']
})
export class CollapsedemoComponent implements OnInit {

  @ViewChild('form3') myForm: NgForm | undefined;
  constructor() { }
  

  myFormIsInvalid(): boolean {
  
     
     if (this.myForm?.valid) {
         return true;
     }
     else
     {
     return false;}

  }


  
  
  ngOnInit(): void {
    
    
  }

}

下图是我得到的结果,但如果你仔细观察,我没有进入电话字段,所以它不应该显示绿色勾号,它必须是一个“X”标记。出于某种原因,它只检查第一个字段是否已填写。如果第一个字段未填写,它会按原样显示“X”图标,但当我仅填写第一个字段时它会更改。

请告诉我为什么会出现这种行为,如果有其他方法可以满足我的要求,请同时提及最好的方法。

【问题讨论】:

  • 据我所知,您错过了将ngModel 添加到您的手机输入
  • @lbsn 哦,是的,我在这里错过了它(现在将编辑它)但它不会以任何方式改变结果。它仍然是一样的。

标签: html css angular twitter-bootstrap ng-bootstrap


【解决方案1】:

虽然您的检查函数称为myFormIsInvalid,但如果表单有效,它实际上会返回true。所以首先改变你的功能:

myFormIsInvalid(): boolean {
     if (this.myForm?.valid) {
        return false;
     } else {
        return true;
     }
}

然后检查您是否在 HTML 模板中声明了正确的条件:*ngIf="myFormIsInvalid()" 然后color:red*ngIf="!myFormIsInvalid()" 然后color:green

话虽如此,您可以直接在模板中检查表单的有效性,因为您有一个模板变量#myForm*ngIf="myForm.valid"*ngIf="myForm.invalid"

【讨论】:

  • 这不会改变任何东西,因为我已经为两个图标提供了正确的相应检查指令 *ngIf=" !myFormIsInvalid()" 用于表单无效时,*ngIf=" myFormIsInvalid()" 用于表单有效时的绿色勾号图标。但我理解你所说的,因为这不是一个好习惯。另外使用 #myForm: *ngIf="myForm.valid" 也不起作用,因为它会为未定义的对象抛出错误。
  • 如果您的意思是使用 *ngif="form3.valid ,它也不起作用,因为它会抛出错误 TS2339 "property not present in type" 错误,因此是 TS 组件文件中的方法。
  • 这是一个简化的例子:stackblitz.com/edit/angular-ivy-zk8wkr
  • 我认为您引用的示例有效,因为表单没有嵌套在手风琴内,并且您没有尝试在手风琴外部访问其实例变量,您是否尝试在手风琴中进行操作并在上显示图标手风琴面板?
  • 我很感激,伙计。不知道我的出了什么问题。肯定是有些冲突。我把它全部删除了,再写一次,它现在工作正常,没有更多错误了。这是链接angular-nauurt-4re71f.stackblitz.io编辑器链接stackblitz.com/edit/angular-nauurt-4re71f?file=src/app/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2014-02-19
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多