Эту проблему можно решить с помощью декоратора ViewChild
, но я не думаю, что такое сложное решение необходимо для этой проблемы. Вместо этого мы можем упростить логику отображения плиток.
Прежде всего мы можем переместить определения плиток в компонент и сохранить их в массиве tiles
;
tiles = [
{ name: 'Animals' },
{ name: 'Plants'},
{ name: 'Organisms'},
];
Затем мы создаем переменную, представляющую развернутую плитку и массив со всеми нераскрытыми плитками.
expandedTile = null;
notExpandedTiles = this.tiles; // at the beginning all tiles are not expanded
Имея все эти данные, шаблон может быть реорганизован с использованием директивы *ngFor
. Дополнительные встроенные стили были перемещены в отдельный файл CSS.
<div *ngIf="expandedTile" class="expanded-tile">
{{expandedTile.name}}
</div>
<br/>
<div class="tiles">
<div *ngFor="let tile of notExpandedTiles;" (click)="showDetails(tile)" class="tile">
{{tile.name}}
</div>
</div>
Когда пользователь щелкает мышью по не развернутой плитке, она передается в качестве аргумента функции showDetails
, которая будет изменять соответствующие данные.
showDetails(clickedTile) {
// assign clickedTile to expandedTile
this.expandedTile = clickedTile;
// Assign array of all tiles except clickedTile to notExpandedTiles
this.notExpandedTiles = this.tiles.filter(tile => tile !== clickedTile);
}
CSS:
.tile, .expanded-tile {
border: 2px solid black;
}
.tile {
display: inline-block;
width: 100px;
height: 100px;
margin-right: 10px;
}
.expanded-tile {
width: 450px;
height: 150px;
}
демо: https://stackblitz.com/edit/angular-8wekfm