以编程方式 select 一行 ag-grid + angular 2

Programmatically select a row ag-grid + angular 2

在 ag-grid 中尝试 select 默认第一行。根据 ag-grid 文档,我应该能够使用 NodeSelection Api(https://www.ag-grid.com/javascript-grid-selection/?framework=all#gsc.tab=0) 来执行此操作。但是我根本无法访问节点对象。 HTML 文件

<div class="pulldown panel panel-default">
          <div class="panel-heading">{{rulesSummaryTitle}}</div>
          <ag-grid-angular #agGrid   class="ag-fresh ag-bootstrap"
                           [gridOptions]="gridOptions"
                           [rowData]="rowData"
                           [columnDefs]="columnDefs"
                           [enableSorting]="true"
                           rowSelection="single"
                           [pagination]="true"
                           [suppressCellSelection]="true"
                           (gridReady)="onGridReady($event)"
                           (rowSelected)="onRowSelect($event)">
          </ag-grid-angular>
      </div>

我在 "onGridReady" 方法中调用节点 selection api 但出错并显示错误消息 "cant call setSelected on undefined".

public onGridReady(event: any): void {
    event.api.sizeColumnsToFit();
    this.gridOptions.api.node.setSelected(true);
  }

gridOptions.api 对象上没有 node 属性。你会想做更多像这样的事情:

public onGridReady(event: any): void {
  event.api.sizeColumnsToFit();
  gridOptions.api.forEachNode(node=> node.rowIndex ? 0 : node.setSelected(true))
}

这将检查数据中的每个节点并查看 rowIndex 是否为 0,如果为 0,则使用节点对象设置所选属性

尝试使用 gridOptions.api.setFocusedCell(0, [column name]),其中列名可以是不可见的列

找到解决方案,问题是 "onGridReady" 函数在从 Observables 填充行数据之前被调用。所以实际上没有 select 语句可以 select 的行。

import { Component } from '@angular/core';
import {Observable} from "rxjs/Observable";
export class Hero {
  id: number;
  name: string;
}

@Component({
  selector: 'my-app',
  template: `
    <ag-grid-angular style="width: 500px; height: 115px;" class="ag-fresh"
                 [rowData]="rowData"
                 (gridReady)="onReady($event)"
                 [columnDefs]="columnDefs">
</ag-grid-angular>
<ag-grid-angular style="width: 500px; height: 115px;" class="ag-fresh"
                 [rowData]="rowData2"
                 (gridReady)="onReady($event)"
                 [columnDefs]="columnDefs">
</ag-grid-angular>
<ag-grid-angular style="width: 500px; height: 115px;" class="ag-fresh"
                 [gridOptions]="gridOptions"
                 [rowData]="rowData3"
                 (gridReady)="onReady($event)"
                 (rowDataChanged)="onRowDataChanged()"
                 [columnDefs]="columnDefs">
</ag-grid-angular>
    `
})
export class AppComponent {
    columnDefs;
    rowData;
    rowData2;
    rowData3;

    constructor() {
      this.gridOptions = {
      rowData: this.rowData3
    };
      console.log("in here");
      console.log("in here");
      console.log("in here");
        this.columnDefs = [
            {headerName: "Make", field: "make"},
            {headerName: "Model", field: "model"},
            {headerName: "Price", field: "price"}
        ];

        this.rowData = [
            {make: "Toyota", model: "Celica", price: 35000},
            {make: "Ford", model: "Mondeo", price: 32000},
            {make: "Porsche", model: "Boxter", price: 72000}
        ]

        let val = [
      {make: "Toyota", model: "Celica", price: 35000},
      {make: "Ford", model: "Mondeo", price: 32000},
      {make: "Porsche", model: "Boxter", price: 72000}
    ];


    let res : Observable<any> = Observable.create(observer => {
      setTimeout(()=>{
        observer.next(val);
      },1);
    });
    res.subscribe(
      resposne => {
        this.rowData2 = resposne;
      });

      let res1 : Observable<any> = Observable.create(observer => {
      setTimeout(()=>{
        observer.next(val);
      },2000);
    });
    res1.subscribe(
      resposne => {
        this.rowData3 = resposne;
      });


    }
       /**
   * Select the first row as default...
   */
  public onRowDataChanged(): void {
    this.gridOptions.api.forEachNode(node => node.rowIndex ? 0 : node.setSelected(true));
  }


    private onReady(params) {
        params.api.sizeColumnsToFit();
       params.api.forEachNode(node => node.rowIndex ? 0 : node.setSelected(true));
    }
}

https://plnkr.co/edit/PSKnSjAo6omDAo5bjm1J.

添加了具有三个 ag-grid 的 plunker。第一个网格具有预定义的 rowdata 值,第二个网格具有从 Observables 填充行数据但延迟非常短,第三个网格具有从具有更高延迟的 observables 填充的行数据值。如果第一个和第二个 "onGridReady" 函数被调用并且第一行得到 selected,但在第三个网格的情况下,我们必须在 "rowDataChanged" 事件上提供 select 行语句对于要 selected 的行。

在onGridReady 上,您可以使用此代码默认选择第一行。

let  rowIndex = 0;
this.GridOptions.api.paginationGoToFirstPage(); // If pagination is implemented
this.GridOptions.api.selectIndex(rowIndex, false, false);
this.GridOptions.api.setFocusedCell(0, "FirstName");

aggrid on ready 函数不适合此交易。 agon ready just drawing table 如果你想操作你必须在 ag 准备好之前处理的数据。但是 this.if 没有选项,您可以在方法中添加此代码。

getProducts: async function() {
      let data = await repository.getAll("Product").then(r => r.list);
      for (let i = 0; i < this.value.length; i++) {
        for (let j = 0; j < data.length; j++) {
          if (this.value[i].productId == data[j].productId) {
            let x = data.splice(j, 1)[0];
            data.unshift(x);
            break;
          }
        }
      }
      this.productDataForAggrid = data;
      this.gridApi.setRowData(this.productDataForAggrid);
      window.watcher = setInterval(this.setSelectedItems, 50, this.gridApi);
    }

除最后一部分外,此函数是普通的get方法。 İf 你 select 在 ag 上编辑了一些行,如果你关闭 ag 所有 selection 将在 table 上删除,但你仍然有哪些数据 selected 在你的数据 属性 当你再次打开 ag 时。您将休假 way.this 部分代码以实现真正的就绪功能,我的意思是在准备数据之前。

setSelectedItems(api) {
      if (this.productDataForAggrid.length == api.getDisplayedRowCount()) {
        for (let i = 0; i < this.value.length; i++) {
          let node = api.getRowNode(this.value[i].productId.toString());
          if (node) {
            node.setSelected(true);
          }
        }
        this.gridApi.sizeColumnsToFit();
        clearInterval(window.watcher);
        window.watcher = 0;
        //console.log("ready!");
      }
    }

首先,我们将添加所有 selected 数据以添加到账单列表中。但是,如果客户想再次重新打开产品 select aggrid,客户将看不到 selected 产品。这个 getproducts 函数在每次打开 ag 时都有效。并获得所有产品。将此数据与我们的值 属性 进行比较。并发送到 setSelectedItems 函数进行检查 selected.


 saveSelectedProducts() {
      this.value.splice(0, this.value.length);
      for (var i = 0; i < this.gridOptions.api.getSelectedRows().length; i++) {
        if (this.gridOptions.api.getSelectedRows()[i].sellPrice === undefined)
          this.gridOptions.api.getSelectedRows()[
            i
          ].sellPrice = this.gridOptions.api.getSelectedRows()[i].odooId;

        if (this.gridOptions.api.getSelectedRows()[i].piece === undefined)
          this.gridOptions.api.getSelectedRows()[i].piece = 1;

        this.value.push(this.gridOptions.api.getSelectedRows()[i]);
      }
      //this.$emit("selectedProductsList", this.value);
      this.openProductPopup = false;
    },

我们需要调用setSelected(true)方法来select行节点。主要问题是获取行节点。

我们可以通过调用getRenderedNodes()方法来获取行节点。根据the doc,

Retrieve rendered nodes. Due to virtualisation this will contain only the current visible rows and those in the buffer.

因此,我们将在 getRenderedNodes() 方法返回的数组的索引 0 处获取第一行节点。实施将如下-

public onGridReady(event: any): void {
  let nodes = event.api.getRenderedNodes();
  if (nodes.length) {
    nodes[0].setSelected(true); //selects the first row in the rendered view
  }
}

这是有效的 plunker 演示:https://plnkr.co/edit/J40sUeDSwyDEi76X

setSelected(false) 可以在 (selectionChanged) 事件上调用。

ag 网格public 方法

上可用的网格事件之一