如何为TypeScript定义的p-table菜单项添加pInitEditableRow实现行编辑
PrimeNG p-table 自定义触发行编辑实现方案
实现思路
pInitEditableRow指令的核心作用是点击时调用p-table实例内置的initRowEdit方法切换行状态,由于p-menu的菜单项是动态生成的,直接动态绑定指令会存在上下文绑定、生命周期触发异常的问题,直接调用表格API实现和指令完全一致的效果,稳定性更高。
具体实现步骤
- 第一步:给p-table绑定模板引用,开启行编辑配置
首先给p-table组件添加模板变量,同时开启行编辑必要属性:
两个必填配置说明:<p-table #roleTable [value]="roles" editable="true" editMode="row"> <!-- 原有表格列内容全部保留 --> </p-table>editable="true":开启表格整体编辑能力editMode="row":设置编辑模式为行级编辑
- 第二步:修改行模板,绑定行编辑指令
给循环渲染的行添加pEditableRow指令,同时获取行索引,确保保存、取消按钮的逻辑能正常定位行:<tr *ngFor="let role of roles; let ri = index" pEditableRow> <!-- 其他业务列省略 --> <td *ngIf="!role.editing" class="more"> <div class="displayFlex flexJustifyEnd"> <p-button (onClick)="toggleMenu(menu, $event, role)" styleClass="p-button-text"> <i class="icon icon-more-vertical"></i> </p-button> </div> <p-menu appendTo="body" #menu [popup]="true" [model]="items"></p-menu> </td> <td *ngIf="role.editing" style="text-align:center" class="displayFlex flexJustifyEnd"> <button pButton type="button" pSaveEditableRow icon="pi pi-check" class="ui-button-success" style="margin-right: .5em" (click)="onRowEditSave(role)"></button> <button pButton type="button" pCancelEditableRow icon="pi pi-times" class="ui-button-danger" (click)="onRowEditCancel(role, ri)"></button> </td> </tr> - 第三步:调整TS逻辑,手动调用表格编辑API
通过ViewChild获取p-table实例,在菜单项的点击回调里直接调用行编辑初始化方法,不需要给菜单项动态加pInitEditableRow属性:import { Component, ViewChild } from '@angular/core'; import { Table } from 'primeng/table'; import { Menu } from 'primeng/menu'; import { Role } from './your-role-model.path'; @Component({ // 你的组件配置 }) export class RoleComponent { @ViewChild('roleTable') roleTable: Table; roles: Role[] = []; items: any[] = []; toggleMenu(menu: Menu, event: Event, role: Role) { this.items = [ { label: 'Edit Role', icon: 'pi pi-pencil', command: () => { // 调用表格API初始化行编辑,和pInitEditableRow指令效果完全一致 this.roleTable.initRowEdit(role); // 同步行编辑状态,控制操作按钮显隐 role.editing = true; } } ] menu.toggle(event); } onRowEditSave(role: Role) { // 原有保存业务逻辑 // 关闭编辑状态 role.editing = false; this.roleTable.closeRowEdit(role); } onRowEditCancel(role: Role, rowIndex: number) { // 原有取消逻辑(比如回滚数据) role.editing = false; this.roleTable.cancelRowEdit(role, rowIndex); } }
注意:不要把
editing定义成组件级的全局变量,要绑定到每一行的role对象上,否则会出现点击编辑所有行同时进入编辑状态的问题。
内容的提问来源于stack exchange,提问作者Benezir
相关产品推荐
相关产品推荐

