AG Grid:通过 ComponentFactoryResolver 在组件中加载网格时未触发 gridReady 事件

Pas*_*lis 5 ag-grid ngoninit angular

在我的 Angular 10 应用程序上,我通过组件工厂解析器加载包含 AG 网格的组件。

当我通过按钮触发工厂解析器时,一切正常。网格已显示并且gridReady事件已正确触发。

ngOnInit()但是,如果我通过 through等触发组件工厂解析器ngAfterViewInit(),则不会触发 gridReady 事件,并且不会显示网格。

我尝试使用 ChangeDetectorRef 服务强制进行更改检测,但这并没有改变任何内容。

这是组件工厂解析器的代码:

export class PlannerComponent implements OnInit {
  @ViewChild('ordersContainer', {read: ViewContainerRef}) container: ViewContainerRef;
  public orders = [];

  constructor(
    private componentFactoryResolver: ComponentFactoryResolver,
    private httpClient: HttpClient
  ) { }

  ngOnInit(): void {
    this.loadOpenOrders();
  }

  loadOpenOrders() {
    this.httpClient.get('/orders')
      .pipe(map((result: any) => {
        const orders = result._embedded.orders;
        orders.forEach((function (order) {
          this.addOrder();
        }).bind(this))
      }))
      .subscribe()
  }

  onGridReady(params) {
    this.gridApi       = params.api;
    this.gridColumnApi = params.columnApi;
    this.gridApi.sizeColumnsToFit();
  }

  addOrder() {
    // Create component dynamically inside the ng-template
    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(OrderComponent);
    const newOrder         = this.container.createComponent(componentFactory);

    // Push the component so that we can keep track of which components are created
    this.orders.push(newOrder);
  }
}

Run Code Online (Sandbox Code Playgroud)

在视图中,组件的加载方式如下:

<div class="container">
  <div class="row">
    <div class="col-6">
      <div class="card card-custom gutter-b">
        <ag-grid-angular
          style="width: 100%; height: 600px;"
          class="ag-theme-alpine"
          [rowData]="ordersToPlan"
          [columnDefs]="columnDefs"
          [rowSelection]="rowSelectionType"
          (gridReady)="onGridReady($event)"   <==== Only triggered through button click, but not on ngOnInit()
          [animateRows]="true"
        >
        </ag-grid-angular>
      </div>
    </div>
    <div class="col-6">
      <button class="btn btn-success mb-5" (click)="addOrder()">Add a new Order</button>
      <div>
        <ng-template #ordersContainer>
        </ng-template>
      </div>
    </div>
  </div>
</div>

Run Code Online (Sandbox Code Playgroud)

如有任何帮助,我们将不胜感激:-)

Pas*_*lis 4

我终于找到了问题所在。我需要强制执行更改检测,但在子组件中(我通过组件工厂解析器加载的组件)。

在order.component.ts:

constructor(
    private cd: ChangeDetectorRef
  ) { }

...

setTransport(transport: Transport): void {
    ...
    this.cd.detectChanges();
  }
Run Code Online (Sandbox Code Playgroud)

非常感谢所有尝试解决此问题的人!