Это просто вопрос правильной логики.Вы действительно просто привязываете расширенное к сложному выражению, которое возвращает состояние, соответствующее тому, сравнивается ли собака.Вам необходимо добавить логику для этого выражения, а также логику для обработки операций расширения / сворачивания панели расширения, которые также зависят от состояния сравнения собаки.Что-то вроде:
<mat-grid-tile-header class="column-header">
{{dog['title']}}
<mat-checkbox
[checked]="dog.compare"
(change)="compare(dog, $event.checked)">compare</mat-checkbox>
</mat-grid-tile-header>
<mat-accordion multi="true" class="dog-compare--dog_parts">
<mat-expansion-panel *ngFor="let part of dog['parts']; index as i"
[expanded]="isExpanded(dog, part, i)"
(opened)="togglePart(dog, part, i, true)"
(closed)="togglePart(dog, part, i, false)">
...
expandedParts = { };
togglePart(dog, part, index, expanded) {
if (dog.compare) {
this.expandPart(index, expanded);
} else {
part.expanded = expanded;
}
}
compare(dog, compare) {
if (compare) {
let alreadyComparing = false;
this.dogs.forEach( (item) => {
alreadyComparing = alreadyComparing || item.compare;
});
if (!alreadyComparing) {
dog.parts.forEach( (part, index) => {
this.expandedParts[index.toString()] = part.expanded;
});
}
dog.compare = compare;
} else {
dog.compare = compare;
let stillComparing = false;
this.dogs.forEach( (item) => {
stillComparing = stillComparing || item.compare;
});
if (!stillComparing) {
this.expandedParts = { };
}
}
}
isExpanded(dog, part, index) {
if (dog.compare) {
return !!this.expandedParts[index.toString()];
} else {
return !!part.expanded;
}
}
expandPart(index, expanded) {
this.expandedParts[index.toString()] = expanded;
}
Вот оно Stackblitz .(Извините - макет немного запутан.)
Это может быть не совсем то, что вы хотите, но, надеюсь, вы можете использовать его в качестве начала.