Angular 6 — Переключать класс на выбранные элементы и отключать класс от других элементов

#angular #ng-class

#angular #ng-класс

Вопрос:

У меня есть цикл Angular, который возвращает список элементов из моей базы данных. Внутри каждого из этих элементов находится массив (в котором находится второй *ngFor цикл.)

Второй цикл ( *ngFor="let option of item.options ) будет иметь четыре результата. Когда я нажимаю на <li> с классом вопроса, я хочу добавить класс, чтобы выделить его. Однако, если я нажму на другой <li> (например, вариант 3 из 4), я хотел бы добавить класс к этому, но удалить его из первого выбранного <li> .

 <ul>
  <li *ngFor="let item of items | async">
    <div>{{ item.title }}</div>
    <div>{{ item.question }}</div>
    <ul>
      <li class="question" *ngFor="let option of item.options">
        {{option}}
      </li>
    </ul>
  </li>
</ul>
  

Возможно, стоит отметить, что в первом цикле у меня могло быть до 15 элементов *ngFor="let item of items | async"

Комментарии:

1. Попробуйте это stackblitz.com/edit /…

2. Спасибо за ответ. К сожалению, это похоже на приведенный ниже ответ, согласно которому, если у меня есть более одного вопроса (в первом цикле ngFor), то выбранный ответ в первом вопросе будет удален, когда будет выбран ответ на другой вопрос.

Ответ №1:

самый простой способ — использовать переменную с именем, например, «itemSelect» и использовать в *ngFor=»..; пусть i=index», при нажатии равнять переменную i и использовать [ngClass] или [className]. Поскольку у вас есть два * ngFor, вам нужен массив переменных

 <!--take acount the let i=index-->
<li *ngFor="let item of items | async;let i=index">
   ...
    <ul>
      <!--use itemSelect[i]-->
      <li [className]="j==itemSelect[i]?'question hightligth':'question'
          *ngFor="let option of item.options;let j=index" 
           (click)="itemSelect[i]=j">
            {{option}}
      </li>
    </ul>
<li>
  

Не забудьте объявить в своем ts

 itemSelect:number[]=[]
  

Комментарии:

1. Боюсь, это не сработает. При нажатии на ответ 1 выделяются только все четыре ответа в вопросе. При нажатии ответов на любой из других вопросов ничего не происходит.

2. Хорошо, значит, это действительно работает, но в коде есть пара ошибок. Сначала должен быть второй, ul перед вложенным li . Во-вторых, вместо i==itemSelect[i] этого должно быть j==itemSelect[i] . Кроме того, последний li не был закрыт правильно. Если вы сможете обновить свой ответ (просто для справки другим пользователям, я пометлю его как ответ! — Спасибо, Элизео, высоко ценится!

3. @ Que, спасибо за совет и приношу извинения за мой код ошибки (только что исправленный)

4. Спасибо за время и усилия, высоко ценится!

Ответ №2:

Вы можете сделать это, обновив свой html следующим образом

 <ul>
  <li *ngFor="let item of items; let i = index">
    <div>{{ item.title }}</div>
    <div>{{ item.question }}</div>
    <ul>
    <li class="question"
        [class.active]="i == parentIndex amp;amp; j == childIndex"
        (click)="setClickedRow(i, j)"
        *ngFor="let option of item.options; let j = index">
        {{ option }}
    </li>
    </ul>
  </li>
</ul>
  

Наконец, вам нужно обновить ваш ts-файл следующим образом

 parentIndex : Number;
childIndex : Number;

setClickedRow(i,j){
 this.parentIndex=i;
 this.childIndex = j;
}
  

Комментарии:

1. Спасибо за ответ. Боюсь, это тоже не сработает. Это работает, если у меня есть один вопрос с четырьмя возможными ответами. Но первый цикл ngFor повторяет до 13 вопросов. В вашем примере нажатие на ответ в вопросе 2 приведет к удалению класса, который был добавлен к ответу в вопросе 1, и так далее для всех других вопросов