#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, и так далее для всех других вопросов