Как показать или скрыть тег div под каждым флажком, если он установлен или снят в Angular?

#javascript #html #angular #typescript #web-deployment

#javascript #HTML #угловатый #typescript #веб-развертывание

Вопрос:

Я хочу отображать элемент div под каждым флажком, когда он установлен, и скрывать его, когда флажок снят.

Ниже приведен мой html:

 <div class="form-group">
  <label for="days">Please select the days:</label>
    <div class="checkbox-inline" *ngFor="let day of days">
       <label>
         <input
         class="form-check-input"
         type="checkbox"
         [value]="day"
         name="{{day}}"
         id="{{day}}"   
         (change)="onDayChecked($event.target.checked)"
         required>
         {{day}}
        </label>
        <div *ngIf="showTime">
             <!--Display this under each checked box and hide if unchecked-->
        </div>
     </div>
   </label>
<div> 

Мой ts-файл:

 isDayChecked: boolean;
  showTime: boolean=false;
  onDayChecked(isdaychecked: boolean) {
    this.isDayChecked=isdaychecked;
    this.showTime=false;
    this.days.forEach(
      day=>{
        if(this.isDayChecked){
          this.showTime=true;
        }
      }
    )
  } 

Используя этот код, когда я устанавливаю один флажок, отображается тег div под каждым днем. Но я хочу отображать тег div только под отмеченными флажками.

Кто-нибудь может, пожалуйста, дать мне знать, как это исправить?

Спасибо

Ответ №1:

Вы можете использовать [(ngModel)] для привязки данных из шаблона к файлу typescript, и как только переменная привязки имеет значение true, покажите данные.

 1. Template

 <div class="row">
    <input type="checkbox" [(ngModel)]="condition">
    <div *ngIf="condition===true">
      <div class="alert alert-success">
        You Can See Me!
      </div>
    </div>
  </div>

2. TS File
  condition : boolean = false;
 

Ответ №2:

Теперь ваши переменные isDayChecked и showTime являются глобальными переменными для компонента, поэтому, когда вы устанавливаете флажок и вызываете функцию onDayChecked, вы меняете значение на переменные isDayChecked и showTime только один раз (не для каждого дня в массиве). Моя рекомендация — преобразовать массив days в массив объектов.

Предлагаемая структура массива:

 days = [
   {
     dayName: 'name',
     showTime: false
   },
   {
     dayName: 'other day',
     showTime: true
   }
];
 

HTML-файл:

    <div class="form-group">
          <label for="days">Please select the days:</label>
            <div class="checkbox-inline" *ngFor="let day of days">
               <label>
                 <input
                 class="form-check-input"
                 type="checkbox"
                 [value]="day.dayName"
                 name="{{day.dayName}}"
                 id="{{day.dayName}}"   
                 (change)="onDayChecked($event.target.checked, day)"
                 required>
                 {{day.dayName}}
                </label>
                <div *ngIf="day.showTime">
                     <!--Display this under each checked box and hide if unchecked-->
                </div>
             </div>
        </div>
 

.ts файл:

Удалите переменные isDayChecked и showTime.

 onDayChecked(isDayChecked: boolean, day: any) {
    day.showTime = isDayChecked;
}