Добро пожаловать в ТАК!
Прежде всего имейте в виду, что при использовании таких библиотек, как Angular Material или ng-bootstrap , у вас есть компоненты, которые уже могут это делать. Поскольку вы используете CDK, вы, вероятно, также используете Angular Material? Тогда вы можете использовать Панель расширения .
В противном случае, как вы и ожидали, вы можете достичь этого довольно легко. Существуют разные способы сделать это, в зависимости от ваших конкретных потребностей (т. Е. Должен ли каждый элемент списка быть расширяемым одновременно или только один?). Я дам вам подсказку о том, что я считаю самым простым способом, а затем вы сможете настроить его под свои нужды.
Прежде всего, добавьте boolean
к вашему типу пользователя, содержащему состояние каждого элемента списка. Давайте назовем это detailsVisible
.
Затем вы хотите добавить ClickHandler к элементам списка, который переключает это boolean
:
<li *cdkVirtualFor="let u of users" class="animated slideInUp" (click)="u.detailsVisible = !u.detailsVisible">
, а затем добавьте детали в некоторый элемент, видимость которого вы контролируете, используя *ngIf
:
<li *cdkVirtualFor="let u of users" class="animated slideInUp" (click)="u.detailsVisible = !u.detailsVisible">
<h2>{{ u.name }} </h2>
<p> {{ u.email }} {{ u.userName }} </p>
<div *ngIf="u.detailsVisible"> additional details in here </div>
</li>
Если вы хотите, чтобы только один элемент был разрешен для одновременного расширения, вы должны пойти на что-то вроде этого. Идея состоит в том, чтобы просто сохранить индекс выбранного элемента и показать только детали для этого.
<li *cdkVirtualFor="let u of users; let i = index" class="animated slideInUp" (click)="expandedElement = i">
<h2>{{ u.name }} </h2>
<p> {{ u.email }} {{ u.userName }} </p>
<div *ngIf="users.indexOf(u) === expandedElement"> additional details in here </div>
</li>
и затем, конечно, добавьте переменную expandedElement
в ваш .ts-файл.