Angular PrimeNG表行编辑
Angular PrimeNG是一个开源的框架,有丰富的原生Angular UI组件,用来做很好的造型,这个框架用来做响应式的网站非常容易。它提供了大量的模板、组件、主题设计、广泛的图标库等等。在这篇文章中,我们将学习Angular PrimeNG表行编辑。
行编辑有助于编辑每一个单独的行,然后修改该行的内容,同时保存它们。这种方法使用手动编辑和保存。
语法:表行编辑的方法如下。
<p-table [value]="tutorials" dataKey="title" editMode="row">
<ng-template pTemplate="body" let-tutorial
let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="tutorial">
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.title" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.title }}
</ng-template>
</p-cellEditor>
</td>
</tr>
</ng-template>
</p-table>
HTML
创建Angular应用程序和模块安装。
第1步:使用以下命令创建一个Angular应用程序。
ng new geeks_angular
JavaScript
第2步:在创建你的项目文件夹即geeks_angular之后,使用以下命令移动到它。
cd geeks_angular
JavaScript
第3步 。在你给定的目录中安装PrimeNG。
npm install primeng --save
npm install primeicons --save
JavaScript
项目结构:安装成功后,将显示以下项目结构。
例子1:在下面的例子中,我们有一个带有Angular PrimeNG的行编辑功能的表。
- app.component.html:
<h1 style="color:green;
text-align:center;">
GeeksforGeeks
</h1>
<h3>Angular PrimeNG Table Row Editing</h3>
<h5>Basic</h5>
<p-table #dt [value]="tutorials"
dataKey="index"
editMode="row"
responsiveLayout="scroll">
<ng-template pTemplate="caption">
<div class="table-header">
List of Tutorials
<span class="p-input-icon-left">
<i class="pi pi-search"></i>
<input pInputText type="text"
(input)=
"dt.filterGlobal($event.target.value, 'contains')"
placeholder="Global Search" />
</span>
</div>
</ng-template>
<ng-template pTemplate="header">
<tr>
<th style="width: 3rem"></th>
<th pSortableColumn="title">
Title <p-sortIcon field="title"></p-sortIcon>
</th>
<th pSortableColumn="category">
Category <p-sortIcon field="category"></p-sortIcon>
</th>
<th pSortableColumn="rating">
Rating <p-sortIcon field="rating"></p-sortIcon>
</th>
<th style="width:8rem"></th>
</tr>
</ng-template>
<ng-template pTemplate="body"
let-tutorial let-editing="editing"
let-ri="rowIndex">
<tr [pEditableRow]="tutorial">
<td>
<p-tableCheckbox [value]="tutorial"
[index]="ri">
</p-tableCheckbox>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.title" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.title }}
</ng-template>
</p-cellEditor>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.category" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.category }}
</ng-template>
</p-cellEditor>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.rating" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.rating }}
</ng-template>
</p-cellEditor>
</td>
<td style="text-align:center">
<button *ngIf="!editing"
pButton pRipple type="button"
pInitEditableRow icon="pi pi-pencil"
(click)="onRowEditInit(tutorial, ri)"
class="p-button-rounded p-button-text">
</button>
<button *ngIf="editing"
pButton pRipple type="button"
pSaveEditableRow icon="pi pi-check"
(click)="onRowEditSave(tutorial, ri)"
class="p-button-rounded
p-button-text
p-button-success mr-2">
</button>
</td>
</tr>
</ng-template>
</p-table>
HTML
- app.component.ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { Table } from 'primeng/table';
import { PrimeNGConfig } from 'primeng/api';
import { MessageService } from 'primeng/api';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styles: [
`
:host ::ng-deep .p-cell-editing {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
`,
],
})
export class AppComponent {
tutorials: Tutorial[];
@ViewChild('dt') table: Table;
clonedTutorials: { [s: string]: Tutorial } = {};
constructor(private primengConfig: PrimeNGConfig) { }
ngOnInit() {
this.tutorials = [
{
title: 'Queue',
category: 'Data Structure',
rating: 8,
},
{
title: 'Circularly LinkedList',
category: 'Data Structure',
rating: 1,
},
{
title: 'Doubly LinkedList',
category: 'Data Structure',
rating: 3,
},
{
title: 'Singly LinkedList',
category: 'Data Structure',
rating: 5,
},
{
title: 'Doubly Ended Queue',
category: 'Data Structure',
rating: 10,
},
{
title: 'Binary Search Tree',
category: 'Data Structure',
rating: 2,
},
{
title: 'Red Black Tree',
category: 'Data Structure',
rating: 9,
},
{
title: 'Breadth First Search',
category: 'Graph',
rating: 6,
},
{
title: "Floyd's Cycle",
category: 'Algorithm',
rating: 7,
},
{
title: 'Travelling Salesman Problem',
category: 'Algorithm',
rating: 4,
},
{
title: 'Bellman Ford',
category: 'Graph',
rating: 8,
},
{
title: 'KMP Algorithm',
category: 'String',
rating: 10,
},
];
this.primengConfig.ripple = true;
}
onRowEditInit(tutorial: Tutorial, index: number) {
this.clonedTutorials[index] = { ...this.tutorials[index] };
}
onRowEditSave(tutorial: Tutorial, index: number) {
if (tutorial.rating > 0) {
delete this.clonedTutorials[index];
} else {
}
}
}
export interface Tutorial {
title?: string;
category?: string;
rating?: number;
}
JavaScript
- app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule }
from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { BrowserAnimationsModule }
from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { TableModule } from 'primeng/table';
import { MultiSelectModule } from 'primeng/multiselect';
import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
TableModule,
MultiSelectModule,
ButtonModule,
InputTextModule,
FormsModule,
],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule { }
JavaScript
输出:
例子2:在下面的例子中,我们可以选择取消Angular PrimeNG中的单元格的编辑。
- app.component.html:
<h1 style="color:green;
text-align:center;">
GeeksforGeeks
</h1>
<h3>Angular PrimeNG Table Row Editing</h3>
<h5>Basic</h5>
<p-table #dt [value]="tutorials"
dataKey="index"
editMode="row"
responsiveLayout="scroll">
<ng-template pTemplate="caption">
<div class="table-header">
List of Tutorials
<span class="p-input-icon-left">
<i class="pi pi-search"></i>
<input pInputText type="text"
(input)=
"dt.filterGlobal($event.target.value, 'contains')"
placeholder="Global Search" />
</span>
</div>
</ng-template>
<ng-template pTemplate="header">
<tr>
<th style="width: 3rem"></th>
<th pSortableColumn="title">
Title <p-sortIcon field="title"></p-sortIcon>
</th>
<th pSortableColumn="category">
Category <p-sortIcon field="category"></p-sortIcon>
</th>
<th pSortableColumn="rating">
Rating <p-sortIcon field="rating"></p-sortIcon>
</th>
<th style="width:8rem"></th>
</tr>
</ng-template>
<ng-template pTemplate="body"
let-tutorial let-editing="editing"
let-ri="rowIndex">
<tr [pEditableRow]="tutorial">
<td>
<p-tableCheckbox [value]="tutorial"
[index]="ri">
</p-tableCheckbox>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.title" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.title }}
</ng-template>
</p-cellEditor>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.category" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.category }}
</ng-template>
</p-cellEditor>
</td>
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input pInputText type="text"
[(ngModel)]="tutorial.rating" />
</ng-template>
<ng-template pTemplate="output">
{{ tutorial.rating }}
</ng-template>
</p-cellEditor>
</td>
<td style="text-align:center">
<button *ngIf="!editing"
pButton pRipple type="button"
pInitEditableRow icon="pi pi-pencil"
(click)="onRowEditInit(tutorial, ri)"
class="p-button-rounded
p-button-text">
</button>
<button *ngIf="editing"
pButton pRipple type="button"
pSaveEditableRow icon="pi pi-check"
(click)="onRowEditSave(tutorial, ri)"
class="p-button-rounded
p-button-text
p-button-success mr-2">
</button>
<button *ngIf="editing"
pButton pRipple type="button"
pCancelEditableRow icon="pi pi-times"
(click)="onRowEditCancel(tutorial, ri)"
class="p-button-rounded
p-button-text
p-button-danger">
</button>
</td>
</tr>
</ng-template>
</p-table>
HTML
- app.component.ts:
import { Component, OnInit, ViewChild } from '@angular/core';
import { Table } from 'primeng/table';
import { PrimeNGConfig } from 'primeng/api';
import { MessageService } from 'primeng/api';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styles: [
`
:host ::ng-deep .p-cell-editing {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
`,
],
})
export class AppComponent {
tutorials: Tutorial[];
@ViewChild('dt') table: Table;
clonedTutorials: { [s: string]: Tutorial } = {};
constructor(private primengConfig: PrimeNGConfig) { }
ngOnInit() {
this.tutorials = [
{
title: 'Queue',
category: 'Data Structure',
rating: 8,
},
{
title: 'Circularly LinkedList',
category: 'Data Structure',
rating: 1,
},
{
title: 'Doubly LinkedList',
category: 'Data Structure',
rating: 3,
},
{
title: 'Singly LinkedList',
category: 'Data Structure',
rating: 5,
},
{
title: 'Doubly Ended Queue',
category: 'Data Structure',
rating: 10,
},
{
title: 'Binary Search Tree',
category: 'Data Structure',
rating: 2,
},
{
title: 'Red Black Tree',
category: 'Data Structure',
rating: 9,
},
{
title: 'Breadth First Search',
category: 'Graph',
rating: 6,
},
{
title: "Floyd's Cycle",
category: 'Algorithm',
rating: 7,
},
{
title: 'Travelling Salesman Problem',
category: 'Algorithm',
rating: 4,
},
{
title: 'Bellman Ford',
category: 'Graph',
rating: 8,
},
{
title: 'KMP Algorithm',
category: 'String',
rating: 10,
},
];
this.primengConfig.ripple = true;
}
onRowEditInit(tutorial: Tutorial, index: number) {
this.clonedTutorials[index] = { ...this.tutorials[index] };
}
onRowEditSave(tutorial: Tutorial, index: number) {
if (tutorial.rating > 0) {
delete this.clonedTutorials[index];
} else {
}
}
onRowEditCancel(tutorial: Tutorial, index: number) {
this.tutorials[index] = this.clonedTutorials[index];
delete this.clonedTutorials[index];
}
}
export interface Tutorial {
title?: string;
category?: string;
rating?: number;
}
JavaScript
- app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule }
from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { BrowserAnimationsModule }
from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { TableModule } from 'primeng/table';
import { MultiSelectModule } from 'primeng/multiselect';
import { ButtonModule } from 'primeng/button';
import { InputTextModule } from 'primeng/inputtext';
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
TableModule,
MultiSelectModule,
ButtonModule,
InputTextModule,
FormsModule,
],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule { }
JavaScript
输出: