【发布时间】:2020-05-17 18:34:40
【问题描述】:
在我的 angular-7 项目中,我正在尝试制作一个带有嵌套材料选项卡的 html 页面,其中第二个选项卡将有另一组选项卡。在第二个选项卡中,尝试为传递给子组件的数据制作画布图表。
这是我的 html 代码。
<mat-tab-group mat-stretch-tabs [selectedIndex]="0">
<mat-tab label="Sales"> Sales
</mat-tab>
<mat-tab label="Purchase">
<!-- <ng-template matTabContent> //This block works but i want in tab format
<div *ngIf="isReady " class="divinput ">
<div *ngFor="let d of data">
<draw [input]="d "></draw>
</div>
</div>
</ng-template> -->
<mat-tab-group *ngIf="isReady"> // this throws error
<mat-tab *ngIf="isReady" label="north">
<ng-template matTabContent>
<div *ngFor="let d of data">
<draw [input]="d"></draw>
</div>
</ng-template>
</mat-tab>
</mat-tab-group>
</mat-tab>
</mat-tab-group>
上面的代码调用了一个子组件“draw”,它具有绘制图表的功能。
private draw (chart){
var canvas = <HTMLCanvasElement> document.getElementById(chart.id);
var ctx = canvas.getContext("2d");
return new Chart(ctx, {
type: 'line',
data: {labels: chart.x,datasets: mydata}
})
}
这会引发错误,TypeError: Cannot read property 'getContext' of null for line var ctx = canvas.getContext("2d"); in function draw。看起来材料选项卡不等待数据可用。我试图通过“isReady”来处理这个问题,但没有运气。
我注意到一件奇怪的事情,当我将 [selectedIndex]="0" 更改为 [selectedIndex]="1" 时它会起作用。但不能将此视为第一个选项卡应根据要求在加载时处于活动状态。
我努力找出问题所在。请帮助解决问题。
【问题讨论】:
-
您在设置 isReady = true 之前是否致电
draw (chart)? -
draw(chart) if from child component and isReady is set in parent component and sent to child.
-
忘记所有准备好的垃圾。只需使用 view child 并确保在 after view init 钩子之前不要在组件中调用 draw
标签: angular angular-material lazy-loading