在 Angular 中动态呈现行时如何将冻结列添加到 primeNG
How to add frozen columns to primeNG when rows are rendering dynamically in Angular
我正在寻求帮助以在我的 primeng table 中添加冻结列功能,其中列和行是动态呈现的。
我确实有一个配置(isPK: true),它来自我想制作冻结列的数据。
我试过按照 stackblitz 进行操作,但找不到与 PrimeNG 文档中给出的示例匹配的解决方案
谢谢@Owen 的回答,但现在如果我尝试在 HTML 本身中添加一个额外的列,它会像这样翻倍,
有时更容易从一个工作示例转移到一个接一个地生成你想要的东西。如下所示
<p-button class="secondary" label="Add row" (onClick)="onAddRow(card)"></p-button>
<p-table #dt [columns]="scrollableCols" [frozenColumns]="frozenCols" [value]="card" [scrollable]="true"
scrollHeight="200px" frozenWidth="200px">
<ng-template pTemplate="colgroup" let-columns>
<colgroup>
<col *ngFor="let col of columns" style="width:200px">
</colgroup>
</ng-template>
<ng-template pTemplate="header" let-columns>
<tr>
<th *ngFor="let col of columns">
{{col.header}}
</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-rowData let-columns="columns">
<ng-container *ngFor="let tr of card[0].rows; let i = index">
<tr>
<ng-container *ngFor="let attr of card[0].attributes; let j = index">
<td
[ngClass]="{'error-block':
(card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true') ||
(card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value.length < card[0].rows[i][j].minLength)}">
<ng-container *ngIf="attr.type === 'string'">
<input pInputText style="width: 100%;"
(ngModelChange)="onChange($event, i, j, card)"
type="text"
[(ngModel)]="card[0].rows[i][j].value"
[maxlength]="card[0].rows[i][j].maxLength"
[minlength]="card[0].rows[i][j].minLength"/>
<span class="error required-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true'">
<!-- This field is required. -->
</span>
<span class="error minlength-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value.length < card[0].rows[i][j].minLength">
<!-- Please enter {{card[0].rows[i][j].minLength}} characters to continue. -->
</span>
<!-- {{i}}, {{j}} {{card[0].rows[i][j] | json}} -->
</ng-container>
<ng-container *ngIf="attr.values">
<select class="dropdown" [(ngModel)]="card[0].rows[i][j].value" (ngModelChange)="onChange($event, i, j, card)">
<option *ngFor="let option of attr.values">{{option}}</option>
</select>
<span class="error required-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true'">
<!-- This field is required. -->
</span>
</ng-container>
<ng-container *ngIf="attr.type === 'date'">
<p-calendar [readonlyInput]="true" panelStyleClass="datepicker" appendTo="body"
inputStyleClass="date-input" [(ngModel)]="card[0].rows[i][j].value"
(ngModelChange)="onChange($event, i, j, card)" dateFormat="mm/dd/yy"></p-calendar>
</ng-container>
</td>
</ng-container>
</tr>
</ng-container>
</ng-template>
</p-table>
您应该按照 Templates 部分文档中的描述对冻结数据使用模板:
frozenheader: Content of the thead element in frozen side.
frozenbody: Content of the tbody element in frozen side.
这是一个工作 example。 Table body 看起来很奇怪,但因为您使用的是动态列,所以列和数据之间必须匹配。
喜欢文档中 Dynamic columns 的这个例子。
我在列定义中添加了一个 属性 isFrozenColumn 并且它完美地工作
请参阅 Frozen Columns 部分 https://www.primefaces.org/primeng/showcase/#/table/scroll
columns = [
{
field: 'name',
header: 'Name',
isFrozenColumn: true
},
{
field: 'Phone',
header: 'phone',
isFrozenColumn: false
}]
页眉
<th alignFrozen="left"
pFrozenColumn
[frozen]="true">Actions</th>
<ng-container *ngFor="let col of columns">
<th class="width-small"
alignFrozen="left"
pFrozenColumn
[frozen]="col?.isFrozenColumn">
<p-header>{{ col.header }}</p-header>
</th>
</ng-container>
正文
<td alignFrozen="left"
pFrozenColumn
[frozen]="true">
<a type="button"
(click)="edit(item)">Edit</a>
</td>
<ng-container *ngFor="let col of columns">
<td alignFrozen="left"
pFrozenColumn
[frozen]="col?.isFrozenColumn">
{{ item[col.field] }}
</td>
</ng-container>
我正在寻求帮助以在我的 primeng table 中添加冻结列功能,其中列和行是动态呈现的。
我确实有一个配置(isPK: true),它来自我想制作冻结列的数据。
我试过按照 stackblitz 进行操作,但找不到与 PrimeNG 文档中给出的示例匹配的解决方案
谢谢@Owen 的回答,但现在如果我尝试在 HTML 本身中添加一个额外的列,它会像这样翻倍,
有时更容易从一个工作示例转移到一个接一个地生成你想要的东西。如下所示
<p-button class="secondary" label="Add row" (onClick)="onAddRow(card)"></p-button>
<p-table #dt [columns]="scrollableCols" [frozenColumns]="frozenCols" [value]="card" [scrollable]="true"
scrollHeight="200px" frozenWidth="200px">
<ng-template pTemplate="colgroup" let-columns>
<colgroup>
<col *ngFor="let col of columns" style="width:200px">
</colgroup>
</ng-template>
<ng-template pTemplate="header" let-columns>
<tr>
<th *ngFor="let col of columns">
{{col.header}}
</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-rowData let-columns="columns">
<ng-container *ngFor="let tr of card[0].rows; let i = index">
<tr>
<ng-container *ngFor="let attr of card[0].attributes; let j = index">
<td
[ngClass]="{'error-block':
(card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true') ||
(card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value.length < card[0].rows[i][j].minLength)}">
<ng-container *ngIf="attr.type === 'string'">
<input pInputText style="width: 100%;"
(ngModelChange)="onChange($event, i, j, card)"
type="text"
[(ngModel)]="card[0].rows[i][j].value"
[maxlength]="card[0].rows[i][j].maxLength"
[minlength]="card[0].rows[i][j].minLength"/>
<span class="error required-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true'">
<!-- This field is required. -->
</span>
<span class="error minlength-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value.length < card[0].rows[i][j].minLength">
<!-- Please enter {{card[0].rows[i][j].minLength}} characters to continue. -->
</span>
<!-- {{i}}, {{j}} {{card[0].rows[i][j] | json}} -->
</ng-container>
<ng-container *ngIf="attr.values">
<select class="dropdown" [(ngModel)]="card[0].rows[i][j].value" (ngModelChange)="onChange($event, i, j, card)">
<option *ngFor="let option of attr.values">{{option}}</option>
</select>
<span class="error required-error" *ngIf="card[0].rows[i].validated == true && isSubmitted && card[0].rows[i][j].value === '' && card[0].rows[i][j].required === 'true'">
<!-- This field is required. -->
</span>
</ng-container>
<ng-container *ngIf="attr.type === 'date'">
<p-calendar [readonlyInput]="true" panelStyleClass="datepicker" appendTo="body"
inputStyleClass="date-input" [(ngModel)]="card[0].rows[i][j].value"
(ngModelChange)="onChange($event, i, j, card)" dateFormat="mm/dd/yy"></p-calendar>
</ng-container>
</td>
</ng-container>
</tr>
</ng-container>
</ng-template>
</p-table>
您应该按照 Templates 部分文档中的描述对冻结数据使用模板:
frozenheader: Content of the thead element in frozen side.
frozenbody: Content of the tbody element in frozen side.
这是一个工作 example。 Table body 看起来很奇怪,但因为您使用的是动态列,所以列和数据之间必须匹配。
喜欢文档中 Dynamic columns 的这个例子。
我在列定义中添加了一个 属性 isFrozenColumn 并且它完美地工作
请参阅 Frozen Columns 部分 https://www.primefaces.org/primeng/showcase/#/table/scroll
columns = [
{
field: 'name',
header: 'Name',
isFrozenColumn: true
},
{
field: 'Phone',
header: 'phone',
isFrozenColumn: false
}]
页眉
<th alignFrozen="left"
pFrozenColumn
[frozen]="true">Actions</th>
<ng-container *ngFor="let col of columns">
<th class="width-small"
alignFrozen="left"
pFrozenColumn
[frozen]="col?.isFrozenColumn">
<p-header>{{ col.header }}</p-header>
</th>
</ng-container>
正文
<td alignFrozen="left"
pFrozenColumn
[frozen]="true">
<a type="button"
(click)="edit(item)">Edit</a>
</td>
<ng-container *ngFor="let col of columns">
<td alignFrozen="left"
pFrozenColumn
[frozen]="col?.isFrozenColumn">
{{ item[col.field] }}
</td>
</ng-container>