我们有一个Angular 5应用程序,我们使用FlexGrid来显示各种数据集。这些数据集可以由不同的视图表示,这些视图是预定义的列集。每次视图更改时,都会更新columnDef并替换itemsSource。现在,如果我们正常加载页面,所有单元格都正确对齐,我们的布尔值显示为复选框。每当我们改变视图时,我们就会失去数字列的对齐,而我们的布尔值只是纯文本的真或假。
我尝试了刷新数据或网格(itemsSource.refresh,dataGrid.invalidate等)的各种方法,但似乎没有任何方法可以纠正对齐。有没有办法手动完成,或者我们是否以错误的方式设置dataSource?
代码:
以下是我们加载columnDef的方法:
<wj-flex-grid etc...>
<wj-flex-grid-column
*ngFor="let col of columnDefs"
[binding]="col.binding"
[header]="col.caption"
[width]="col.width"
>
</wj-flex-grid-column>
</wj-flex-grid>
JavaScript:
private getLayout(): void {
this.layoutService.get(this.dataName).subscribe(
(result: ViewDef) => {
this.caption = result.caption;
this.columnDefs = result.columnDefs;
},
() => console.log('Could not load layout.')
);
}
以下是我们更新itemsSource的方法:
private setItemsSource(result) {
this.dataGrid.beginUpdate();
const scrollPos = this.dataGrid.scrollPosition;
if (this.selectNextBeforeUpdate) {
this.selectNext();
}
// save selected and collapsed state
const selectedRows = [];
const collapsedRows = [];
this.dataGrid.rows.forEach(row => {
if (row.dataItem) {
if (row.isSelected) {
selectedRows.push(row.dataItem.id);
}
if (row instanceof GroupRow && row.isCollapsed) {
collapsedRows.push(row.dataItem.id);
}
}
});
const idCurrentItem = this.idCurrentItem;
this.dataGrid.itemsSource = new CollectionView(result);
if (idCurrentItem) {
this.dataGrid.rows.forEach(row => {
if (row.dataItem.id === idCurrentItem) {
this.dataGrid.selection = new CellRange(row.index, this.dataGrid.selection.col);
}
});
}
// restore collapsed and selected state
this.dataGrid.rows.deferUpdate(() => {
this.dataGrid.rows.forEach(row => {
if (row instanceof GroupRow && collapsedRows.indexOf(row.dataItem.id) > -1) {
row.isCollapsed = true;
}
if (selectedRows.indexOf(row.dataItem.id) > -1) {
row.isSelected = true;
}
});
});
this.dataGrid.scrollPosition = scrollPos;
this.initializeHeader();
if (this.selectNextAfterUpdate) {
this.selectNext();
}
this.dataGrid.endUpdate();
}
我们在这里有额外的代码来保留我们的选择,因为Wijmo在更改CollectionView时重置选择。