#html #angular #typescript
Вопрос:
У меня есть таблица, и я хочу использовать «показывать больше/ показывать меньше текста pos.report
«. в настоящее время, когда я нажимаю «Показать больше» для одного <td>
, он показывает больше для всех <td>
в таблице.
.Html
<tbody>
<tr *ngFor="let pos of procedureOrderList; let i = index">
<td>{{pos.investigationName}}</td>
<td>{{pos.investigationDate | date: 'dd-MM-yyyy'}}</td>
<td>{{pos.released_DT | date: 'dd-MM-yyyy'}}</td>
<td> <ng-container *ngIf="pos.report">
{{(show) ? pos.report : pos.report | slice:0:50}}
<a *ngIf="pos.report.length > 0;" (click)="show = !show" > ...{{ show ? '[Show less]': '[Show More]' }}</a>
</ng-container>
</td>
</tr>
</tbody>
.ts
show = false;
Комментарии:
1. Поместите свойство ‘show’ в любой класс/интерфейс ‘pos’.
2. вы хотите добавить «показать» в <tr>? @RoddyoftheFrozenPeas
3. @Хамда stackblitz.com/edit/… тебе нужно что-то вроде этого.
4. Нет, я имел в виду вставить его в модель.
Ответ №1:
Рабочая демонстрация по этой ссылке на Stackblitz
В принципе, вам нужно присвоить свойству show значение индекса i, и в соответствии со значением show и i вы можете отображать «показывать больше» или «показывать меньше» только для выбранного элемента td.
<table>
<tbody>
<tr *ngFor="let pos of procedureOrderList; let i = index">
<td>{{pos.investigationName}}</td>
<td>{{pos.investigationDate | date: 'dd-MM-yyyy'}}</td>
<td>{{pos.released_DT | date: 'dd-MM-yyyy'}}</td>
<td>
<ng-container *ngIf="pos.report">
{{(show) ? pos.report : pos.report | slice:0:50}}
<a *ngIf="pos.report.length > 0;" (click)="((show = i ))">
...{{ (( show === i)) ? '[Show less]': '[Show More]' }}</a>
</ng-container>
</td>
</tr>
</tbody>
</table>
Комментарии:
1. побочным эффектом этого рабочего процесса, который, кстати, решает проблему, является то, что вы можете показывать только одну строку за раз. поэтому, если вы «покажете» строку 1, а затем нажмете «показать» в строке 2, строка 1 перестанет отображаться. это может быть или не быть тем, чего хочет ОП, в вопросе не уточняется.
Ответ №2:
В качестве альтернативы методу ГаурангДхорды вы также можете расширить используемую модель, включив «показать» в качестве свойства.
Поэтому , предполагая, что pos
это тип Pos
, определил что-то вроде этого:
interface Pos {
investigationName: string;
investigationDate: date;
release_DT: date;
report: string;
}
… затем вы можете расширить этот интерфейс (или класс) и предоставить ему свойство «показывать», как это:
interface ShowablePos extends Pos {
show: boolean;
}
Тогда хитрость в том, что когда вы получаете свои экземпляры Pos (например, из API), вы используете map
вызов для преобразования их в экземпляры ShowablePos:
posApi.getProcedureOrderList()
.pipe(map( posList => {
// each pos is show=false by default
return posList.map(pos => ({ ...pos, show: false }))
}))
.subscribe(...)
Тогда единственное изменение, которое вам нужно внести в свой HTML, — это ссылка на pos.show
вместо глобального show
.
<td>{{pos.investigationName}}</td>
<td>{{pos.investigationDate | date: 'dd-MM-yyyy'}}</td>
<td>{{pos.released_DT | date: 'dd-MM-yyyy'}}</td>
<td>
<ng-container *ngIf="pos.report">
{{(pos.show) ? pos.report : pos.report | slice:0:50}}
<a *ngIf="pos.report.length > 0;" (click)="pos.show = !pos.show" > ...{{ pos.show ? '[Show less]': '[Show More]' }}</a>
</ng-container>
</td>