微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

但是,如果我通过ngOnInit()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);
  }
}

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

<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>

感谢您的帮助:-)

解决方法

我在您的代码中的某个地方看到了问题。

它应该在addOrders调用的pipe部分中完成,而不是在subscribe运算符中调用get

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

为什么我认为这会有所帮助? -也许变更检测周期可能与rxjs subscribe的{​​{1}}有关;并且由于您的代码正在Observable之前/之外进行所有这些工作,因此该循环可能会丢失它。

由于我无法将这些代码用作注释,因此请将其发布为答案。让我知道这个是否奏效。评论您收到的任何错误/观察到的错误。如果您可以提供任何可行的示例(plunk / stackblitz),将能够迅速为您提供帮助。

如果此答案无济于事,则将其删除。

,

尝试一下:

转换

public orders = [];

进入可观察范围:

private ordersBS = new BehaviourSubject<any[]>([]);
public orders$ = this.ordersBS.asObservable();

HTML:

[rowData]="orders$ | async"

添加订单时:

this.ordersBS.next(newOrder);

这样,agGrid将始终监听可观察到的订单。

onGridReady函数应该仅被调用一次。

,

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

order.component.ts中:

constructor(
    private cd: ChangeDetectorRef
  ) { }

...

setTransport(transport: Transport): void {
    ...
    this.cd.detectChanges();
  }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。