我正在使用typescript尝试使用angular2中的ag-grid,由于某些原因我无法使用ag-grid API,导致未定义的错误。
这是代码..,
import { AgRendererComponent } from 'ag-grid-ng2/main';
import { GridOptions, RowNode } from 'ag-grid/main';
import { GridOptionsWrapper } from 'ag-grid/main';
import { GridApi } from 'ag-grid/main';
public gridOptions: GridOptions;
constructor()
{
this.gridOptions = <GridOptions>{};
alert(this.gridOptions);
alert(this.gridOptions.api); // *** getting undefined ***
this.gridOptions = <GridOptions>{
columnDefs: this.columnDefs(),
rowData: this.rowData,
onSelectionChanged: this.onSelectionChanged,
groupSelectsChildren: true,
suppressRowClickSelection: true,
rowSelection: 'multiple',
enableColResize: true,
enableSorting: true,
rowHeight: 45}
}//constructor
请指教,谢谢
更新了以下评论中的代码
onGridReady() {
console.log(this.gridOptions.api); // here it work
this.selectedRows = this.gridOptions.api.getSelectedRows();
console.log(this.selectedRows);
}
private testClick(event): void {
try {
console.log(this.gridOptions.api); // here gives error
this.selectedRows = this.gridOptions.api.getSelectedRows();
console.log(this.selectedRows); //getting error saying undefined
}
}
答案 0 :(得分:6)
gridOptions
api将在设置网格的gridReady
事件后设置并准备就绪。
在您正在测试它的行上,gridOptions
只是一个空对象,甚至在您执行此操作之后:
this.gridOptions = <GridOptions>{
columnDefs: this.columnDefs(),
...other lines
它仍然没有api可用 - 挂钩gridReady
或角度ngOnInit
事件,你将能够安全地调用api。
答案 1 :(得分:6)
两个问题......
首先,正如其他人所提到的那样,在onGridReady中初始化对grid api的引用,如此
onGridReady(params) {
this.gridApi = params.api;
}
其次,当ag-grid调用您提供的一个处理程序(例如rowClicked)时,this
不再是您的角度组件实例,因此在testClick()
方法this.gridOptions === undefined
中。
要在AgGrid事件回调中访问角度组件的属性,您应该通过this
通过GridOptions.context
,如下所示:
this.gridOptions = <GridOptions>{
context: {parentComponent: this},
...other lines
AgGrid的事件(通常)在事件参数中返回对此上下文对象的引用。
rowClicked(rowClicked: RowClickedEvent) {
const localGridApiRef = rowClicked.context.parentComponent.gridApi;
// do stuff with the grid api...
const selectedRows = localGridApiRef.getSelectedRows();
};
注意:我不确定您是如何使用testClick()
但我的rowClicked()
可以互换的,我希望...
注意2 - GridApi
实际上是RowClickedEvent
的属性,因此虽然通过上下文对象获取它是多余的,但它说明了访问属性的重点/ ag网格事件中角度分量的方法可以通过AgGridEvent
的{{1}}属性完成。
答案 2 :(得分:0)
这是因为组件的生命周期。在constructor
中,它尚未初始化。 (我假设您已正确地将gridOptions对象分配给您的网格。)
尝试在
中使用它ngOnInit() {
console.log(this.gridOptions.api)
}
来自文档
ngOnInit首先在Angular之后初始化指令/组件 显示数据绑定属性并设置指令/组件 输入属性。
获取有关生命周期here的更多信息。
答案 3 :(得分:0)
我正在使用vue.js 有同样的问题。 但是当我包括 我的ag-grid-vue组件中的:gridOptions =“ gridOptions” 解决了我的问题
答案 4 :(得分:0)
我在使用AngularJS时正在寻找答案。对于其他遇到与我相同的问题的人(尽管这不是AngularJS的特定问题),我发现我没有正确地在HTML中调用该表。由于从未调用过该表,因此永远不会设置api,也永远不会运行gridReady。我使用的语法有效:
<div class="table-body">
<div ag-grid="$ctrl.gridOptions" class="ag-theme-fresh ag-grid-container"></div>
</div>
答案 5 :(得分:-1)
试试这个:
import networkx as nx
from networkx import bipartite
def plotGraph(graph,ax,title):
pos=[(ii[1],ii[0]) for ii in graph.nodes()]
pos_dict=dict(zip(graph.nodes(),pos))
nx.draw(graph,pos=pos_dict,ax=ax,with_labels=True)
ax.set_title(title)
return
if __name__=='__main__':
#---------------Construct the graph---------------
g=nx.Graph()
edges=[
[(1,0), (0,0)],
[(1,0), (0,1)],
[(1,0), (0,2)],
[(1,1), (0,0)],
[(1,2), (0,2)],
[(1,2), (0,5)],
[(1,3), (0,2)],
[(1,3), (0,3)],
[(1,4), (0,3)],
[(1,5), (0,2)],
[(1,5), (0,4)],
[(1,5), (0,6)],
[(1,6), (0,1)],
[(1,6), (0,4)],
[(1,6), (0,6)]
]
for ii in edges:
g.add_node(ii[0],bipartite=0)
g.add_node(ii[1],bipartite=1)
g.add_edges_from(edges)
#---------------Use maximal_matching---------------
match=nx.maximal_matching(g)
g_match=nx.Graph()
for ii in match:
g_match.add_edge(ii[0],ii[1])
#----------Use bipartite.maximum_matching----------
match2=bipartite.maximum_matching(g)
g_match2=nx.Graph()
for kk,vv in match2.items():
g_match2.add_edge(kk,vv)
#-----------------------Plot-----------------------
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(10,8))
ax1=fig.add_subplot(2,2,1)
plotGraph(g,ax1,'Graph')
ax2=fig.add_subplot(2,2,2)
plotGraph(g_match,ax2,'nx.maximal_matching()')
ax3=fig.add_subplot(2,2,3)
plotGraph(g_match2,ax3,'bipartite.maximum_matching()')
plt.show()
它对我有用!