【问题标题】:Two issues when I use row editing in PrimeNG在 PrimeNG 中使用行编辑时的两个问题
【发布时间】:2020-03-10 22:00:19
【问题描述】:

在我的 Angular 项目中,我使用 PrimeNG。我正在尝试使数据表中的行可编辑,因此我按照文档进行操作,但我面临两个问题。我试图解决它们,但失败了。

第一个:当我点击编辑按钮时,所有行都变成可编辑的并且应该只有被点击的行?

第二个:编辑只在客户端完成,没有发送和编辑到API,这是控制台中的错误消息:

PUT http://localhost:4200/api/clints/0 404(未找到)

这是我的** HTML **:

<p-table #dataTbl id="printTbl" 
            [columns]="cols" 
            [value]="clients" 
            [scrollable]="true" 
            [paginator]="false"
            [rows]="2" scrollHeight="200px" 
            [resizableColumns]="false" 
            selectionMode="multiple"
            [(selection)]="selectedClient" 
            emptyMessage="عفواً يرجي إدخال بيانات أولاً"
            editMode="row">
...
 <ng-template pTemplate="body" let-rowData let-editing="editing" let-ri="rowIndex" let-columns="columns">
                    <tr [pSelectableRow]="rowData" [pEditableRow]="rowData" >
                        <ng-container >              
                        <td  class="ui-resizable-column" *ngFor="let col of columns">
                            <p-cellEditor>
                                <ng-template pTemplate="input">
                                    <input pInputText type="text" [(ngModel)]="rowData[col.field]"/>
                                </ng-template>
                                <ng-template pTemplate="output">
                                        {{ rowData[col.field] }}
                                </ng-template>
                            </p-cellEditor>
                        </td>
                        <td class="text-center">
                            <button *ngIf="!editing" pButton type="button" pInitEditableRow (click)="onRowEditInit(rowData)" class="btn btn-info">
                                <span class="fa fa-edit"></span>
                            </button>
                            <button *ngIf="editing" pButton type="button" pSaveEditableRow icon="pi pi-check" class="ui-button-success" style="margin-right: .5em" (click)="onRowEditSave(rowData)"></button>
                            <button *ngIf="editing" pButton type="button" pCancelEditableRow icon="pi pi-times" class="ui-button-danger" (click)="onRowEditCancel(rowData, ri)"></button>
                            <button class="btn btn-danger">
                                <span class="fa fa-trash"></span>
                            </button>
                        </td>
                        </ng-container>
                    </tr>
                </ng-template>
            </p-table>

** 组件.ts **


  private myForm: FormGroup;
  clients: Clients[];
  selectedClient: Clients[];
  clonedClient: { [s: string]: Clients; } = {};
  cols: any[];
  exportColumns: any[]; 
  display: boolean = false;
constructor(private formBuilder: FormBuilder,
    private Service: ClientsService, 
    private messageService: MessageService) { }
ngOnInit() {

    this.refreshList();
this.cols = [
      { field: 'id', header: '#' },
      { field: 'name', header: 'الاسم' },
      { field: 'phone', header: 'الهاتف' },
      { field: 'address', header: 'العنوان' },
      { field: 'account', header: 'الحساب' },
      { field: 'nots', header: 'ملاحظات' },
    ];
}
refreshList() {this.Service.getAllClients()
    .subscribe(data => this.clients = data);
  }

  PostClient() {

      this.Service.addClient().subscribe(res => {
        this.messageService.add({severity:'success', summary: 'عملية ناجحة', detail:'تمت الإضافة بنجاح'}); // show success massage
        this.refreshList();
      },
        err => {
          console.log(err)
        })
    }

  onRowEditInit(client: Clients){
    this.clonedClient[client.id]={...client}
  }
  onRowEditSave(client: Clients){


      this.Service.editClient().subscribe(res => {
        this.messageService.add({severity:'success', summary: 'عملية ناجحة', detail:'تم النحديث بنجاح'}); // show success massage
        this.refreshList();

      },
          err => {
          console.log(err)
        })
    }

  onRowEditCancel(){


  }

** service.ts **


  clientsUrl="http://localhost:4200/api/clints"

  client:Clients;


  constructor(private http:HttpClient) { }
getAllClients():Observable<Clients[]>{
    return this.http.get<Clients[]>(this.clientsUrl);

}
addClient(){
  // this.client= new Clients();
return this.http.post(this.clientsUrl,this.client)

  }

editClient(){
  return this.http.put(this.clientsUrl + "/" + this.client.id,this.client)

    } 
}

感谢您的帮助

更新

你可以查看这个链接https://stackblitz.com/edit/angular-6fkyui?file=src%2Fapp%2Fclients%2Fclients.service.ts]对不起它的第一个stackblitz

【问题讨论】:

  • 如果您提供重现该问题的 stackblitz 会很容易。
  • 非常感谢您的支持,非常感谢您的合作。你可以查看这个链接 [stackblitz.com/edit/…Excuse me its first stackblitz

标签: angular typescript primeng primeng-turbotable


【解决方案1】:

&lt;p-table&gt;中使用“dataKey”即可解决此问题。

【讨论】:

  • 非常感谢,它现在可以工作了,我使用 .dateKey="id"。但是我还有一个问题,当我使用模态或确认消息重复多次时,你有什么解决方案
  • 模态或确认消息是一个数组。因此,请确保在显示时清空数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多