【问题标题】:How to add frozen columns to primeNG when rows are rendering dynamically in Angular当行在Angular中动态呈现时如何将冻结列添加到primeNG
【发布时间】:2021-05-17 13:48:43
【问题描述】:

我正在寻求帮助,以便在我的primeng 表中添加冻结列功能,其中列和行是动态呈现的。

我确实有一个配置(isPK: true),它来自我想要制作冻结列的数据。

我已尝试关注 stackblitz,但找不到与 PrimeNG 文档中给出的示例相匹配的解决方案

谢谢@Owen 的回答,但现在如果我尝试在 HTML 本身中添加一个额外的列,它会像这样翻倍,

https://stackblitz.com/edit/primeng-tablescroll-demo-jvmrfs

【问题讨论】:

  • 你的意思是,不可编辑?如果是,那么您可以在非编辑模式下为单元格提供值。前任。您使用的 pInputText 在某些情况下可以处于禁用模式。

标签: angular primeng primeng-datatable


【解决方案1】:

有时更容易从一个工作示例转移并一步一步生成您想要的内容。类似下面的东西

<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>

See Demo Here

【讨论】:

【解决方案2】:

您应该按照Templates 部分中的文档中所述对冻结数据使用模板:

frozenheader:冻结侧的thead元素的内容。

frozenbody:冻结侧的 tbody 元素的内容。

这是一个有效的example。表体看起来很奇怪,但是因为您使用的是动态列,所以列和数据之间必须匹配。

喜欢文档中Dynamic columns 的这个例子。

【讨论】:

    【解决方案3】:

    我像这样在列定义中添加了一个属性 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-02
      • 2019-07-30
      • 1970-01-01
      • 2021-02-05
      • 2018-06-25
      • 2014-06-14
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多