Ag-Grid 从父级更新行数据

Ag-Grid update rowdata from parent

我有两个组件,一个用于选择(用户类型、用户),一个用于添加所选用户。

还有一个带有 ag-grid 的,我应该在其中显示来自上述组件的用户。

我之所以将它们放入不同的组件中,是因为我的老板想在应用程序的另一部分中重用第一个,我也打算将它与类似的组件一起使用,并要求我这样做就这样。

我已经在组件的开头传递了值,但我不知道如何检测数据何时更改以刷新网格。

parentComponent.HTML:

<div class="modal-body">
    <label>Reviewers are optional, select a review type and reviewer below to add to the submission 
        as reviewers</label>
    <div class="clr-row">
        <div class="clr-col-12 clr-col-md-6 clr-col-lg-4 clr-col-xl-4">
            <clr-select-container>
                <label>Review Type</label>
                <select clrSelect name="reviewerTypes" (change)="onChange(currentReviewerType)" 
                    [(ngModel)]="currentReviewerType">
                    <option [value]="" selected disabled hidden>
                        Choose value
                    </option>
                    <option *ngFor="let reviewType of reviewerTypes" [ngValue]="reviewType">
                        {{reviewType.reviewType}}
                    </option>
                </select>
            </clr-select-container>
        </div>
        <div class="clr-col-12 clr-col-md-6 clr-col-lg-4 clr-col-xl-4">
            <clr-select-container>
                <label>Reviewer</label>
                <select clrSelect name="options" [(ngModel)]="currentReviewer">
                    <option value="" selected disabled hidden>Choose value</option>
                    <option *ngFor="let reviewer of reviewers" [ngValue]="reviewer">
                        {{reviewer.user}}
                    </option>
                </select>
            </clr-select-container>
        </div>
    </div>
    <div class="clr-row" style="margin-top: 20px;">
        <div class="clr-col-12 clr-col-md-6 clr-col-lg-4 clr-col-xl-3">
            <clr-button-group class="btn-primary">
                <clr-button (click)="addReviewer()" >Add Reviewer</clr-button>
            </clr-button-group>
        </div>
    </div>
</div>
<div class="modal-footer">
    <app-q-sub-reviewer-grid style="width: 100%;" [reviewersAdded]='reviewersAdded'></app-q-sub- 
    reviewer-grid>
</div>

parentComponent.ts:

ngOnInit() {
   this.dataService.GetReviewerTypes().subscribe( response => this.reviewerTypes = response, error => 
   console.log(error));
   this.mockType = {id:1, reviewType:"type"}
   this.mockReviewer = {userId:1,user:"Samel"}
   //////////// this is a mock to see if it was working, i'll remove this lates
   let reviewerToAdd = {reviewerType:this.mockType, reviewer:this.mockReviewer}
   this.reviewersAdded.push(reviewerToAdd)
   this.reviewersAdded.push(reviewerToAdd)
   this.reviewersAdded.push(reviewerToAdd)
}

onChange(selection){
   let reviewerId = selection;
   this.dataService.GetReviewersByType(reviewerId.id).subscribe( (response)=> {
     this.reviewers = response
     this.currentReviewer = response[0]
   }, 
   error => console.log(error));
}

addReviewer(){
   console.log(this.currentReviewer)
   let reviewerToAdd = {reviewerType:this.currentReviewerType, reviewer:this.currentReviewer}
   this.reviewersAdded.push(reviewerToAdd)
   console.log(this.reviewersAdded)
}

childGridComponent.HTML:

<ag-grid-angular style="width: 100%; height: 118px;" class="ag-theme-balham" 
   [rowData]="rowData"
   [columnDefs]="columnDefs"
   [animateRows]="true" 
   [enableSorting]="true" 
   [enableFilter]="true" 
   (gridReady)="onGridReady($event)" 
   (gridSizeChanged)="onGridSizeChanged($event)">
</ag-grid-angular>

childGridComponent.ts

@Input('reviewersAdded') reviewersAdded: any[];

constructor() {
   this.columnDefs = [
     { headerName: "Review Type", sortable: true, filter: true, field: 'reviewerType', 
      suppressSizeToFit: false },
     { headerName: "Reviewer", sortable: true, filter: true, field: 'reviewer', suppressSizeToFit: 
      false }
   ]
   this.defaultColDef = { filter: true };
}

ngOnInit() {
}

onGridReady(params) {
   this.gridApi = params.api;
   this.gridApi.sizeColumnsToFit();
   this.gridColumnApi = params.columnApi;
   this.reviewersAdded.forEach(item => {
   this.rowData.push({ reviewerType: item.reviewerType.reviewType, reviewer: item.reviewer.user })
      var res = this.gridApi.updateRowData({ add: [{ reviewerType: item.reviewerType.reviewType, 
      reviewer: item.reviewer.user }] });
      console.log(res);
   })
}

//////this ngOnChanges is not working
ngOnChanges(changes: SimpleChanges) {
   console.log(this.reviewersAdded)
}

onGridSizeChanged(params: GridSizeChangedEvent) {
   params.api.sizeColumnsToFit();

}

我认为 ngOnChanges 不会被解雇,因为它是一个数组,而数组和对象是引用类型。 ngOnChanges 只有在数组或对象在内存中的位置发生变化时才会生效。所以你必须不可变地修改数组。

ngOnInit() {
   this.dataService.GetReviewerTypes().subscribe( response => this.reviewerTypes = response, error => 
   console.log(error));
   this.mockType = {id:1, reviewType:"type"}
   this.mockReviewer = {userId:1,user:"Samel"}
   //////////// this is a mock to see if it was working, i'll remove this lates
   let reviewerToAdd = {reviewerType:this.mockType, reviewer:this.mockReviewer}
   this.reviewersAdded.push(reviewerToAdd)
   this.reviewersAdded.push(reviewerToAdd)
   this.reviewersAdded.push(reviewerToAdd)
   // have to spread the reviewerToAdd object as well since it's a reference type
   this.reviewersAdded = [...this.reviewersAdded, {...reviewerToAdd }];
}
....
addReviewer(){
   console.log(this.currentReviewer)
   let reviewerToAdd = {reviewerType:this.currentReviewerType, 
   reviewer:this.currentReviewer}
   this.reviewersAdded = [...this.reviewersAdded, { ...reviewerToAdd }];
   console.log(this.reviewersAdded)
}

有了这些变化,看看 ngOnChanges 是否激活。

如果 ngOnChanges 激活,您将需要更新行数据,甚至可能需要使用 gridApi 或发出另一个 http 请求并查看数据是否更改。

您可以在代码中使用现有的输入事件发射器:

在你的子(网格)组件中 定义您的数据源或评论者 属性.

dataSource: any; // your reviewers that feeds the table.
get reviewersAdded() {
   return this.dataSource;
}

@Input() set reviewersAdded(val: any) {
    if (this.dataSource !== val) {
       this.dataSource = val; // update the datasource
   }
}