javascript - 基于输入的角度重新渲染数据表
问题描述
我有一个包含 3 个组件的组件。其中一个组件是可单击的 DataTable(实例化为初始值),单击新行时,它会发出由其他 2 个组件接收的输出值,该值应相应更新。对于其他 2 个组件中涉及的图形,我可以正常工作,但我无法让它在其中一个组件中重新渲染 DataTable。每次点击我的数据都是正确的,但是 DataTable 似乎一键落后(例如,当我默认为 State1 时,表中没有数据显示,但当我点击进入 State2 时,显示来自 State1 的数据等。
下面是我的大部分代码(不包括一些标题)。我构造了一个引用相关 HTML(数据表)的 DataTableDirective,指定我的 Input(从另一个未图示的组件发出),将我的 dtOptions 初始化为一个空的 DataTable,实例化我的 dtTrigger,然后指定相关方法(ngOnChanges 将重新调用API 并获取新数据,然后应将其重新呈现到 DataTable 中)。
<div class="card-body text-dark">
<table datatable id="typesTable" class="table table-striped table-bordered display responsive"
style="width:100%" [dtOptions]="dtOptions" [dtTrigger]="dtTrigger"></table>
</div>
export class TypesComponent implements OnChanges {
constructor(private elementRef: ElementRef) { }
@ViewChild(DataTableDirective, {static: false})
dtElement: DataTableDirective;
@Input() stateCounty: string; // format "NY-NewYork"
dtOptions: any = {
data: [
],
columns: [
{title: 'Col1', data: 'Col1'},
{title: 'Col2', data: 'Col2'}
],
order: [['1', 'desc']],
pagingType: 'full_numbers',
processing: true,
dom: 'Bfrtip',
buttons: [ 'csv', 'excel' ],
};
dtTrigger: Subject<any> = new Subject();
async ngOnChanges(changes: SimpleChanges): Promise<void> {
const baseUrl = 'https://baseurl.com';
// make the graph
const state = changes.stateCounty.currentValue.split('-')[0];
const city = changes.stateCounty.currentValue.split('-')[1];
let graph = this.elementRef.nativeElement.querySelector('#timeDiv');
graph.innerText = `Loading...`;
let types = await fetchRetry(baseUrl + `api=${state}&city=${city}`);
types = await types.json();
...
graph.innerText = '';
graph = Plotly.newPlot(graph, data, layout);
...
this.dtOptions = {
data: types,
columns: [
{title: 'Col1', data: 'Col1'},
{title: 'Col2', data: 'Col2'}
],
order: [['1', 'desc']],
pagingType: 'full_numbers',
processing: true,
dom: 'Bfrtip',
buttons: [ 'csv', 'excel' ],
};
this.rerender();
}
ngOnInit(){}
ngAfterViewInit(): void {
this.dtTrigger.next();
}
ngOnDestroy(): void {
this.dtTrigger.unsubscribe();
}
rerender(): void {
try {
this.dtElement.dtInstance.then((dtInstance: DataTables.Api) => {
dtInstance.destroy();
this.dtTrigger.next();
});
} catch (err) {
console.log(err);
}
}
}
解决方案
可能是新元素推送到它时表数据没有更新。我认为问题与 ngFor 数组对象在将新元素推送到数组时无法更新 DOM 相同。
请参考此链接Angular2: *ngFor does not update when array is updated 这是我的假设,不是您问题的实际解决方案。
推荐阅读
- http - 戈朗。如何自动授权我的应用访问 spotify API?
- java - Intellij 中的 AWSToolkit,环境变量不起作用
- javascript - 使用 Jest 对仅在函数存在时调用函数的 JavaScript 进行单元测试
- python - 无法摆脱使用 asyncio 时出现的一些错误页面
- php - 使用 htaccess 重定向到 https,但不使用 XAMPP 进行开发
- c# - 我可以对 Azure Cosmos 中的 DateTimeOffset 序列化对象使用 DateTimePart 函数吗?
- c# - 无法将 Json 字符串反序列化为 .NET 对象,但反序列化后对象为空
- c# - 使用 Nodejs/Electron 处理 Windows COM 对象
- c++ - 如何获取特定子进程的进程 ID?(C++)
- python - 如何使用 Gurobi Python API 添加“For”循环