ChartJS 将图表组件动态添加到Razor Page

hec6srdp  于 2022-11-07  发布在  Chart.js
关注(0)|答案(3)|浏览(202)

我已经用blazor构建了一个很好的图表(服务器端)组件。它使用了jschart。一切都很好,而且它工作得很好。
在ChartComponent中。我有这个。

@using Blazorise.Charts
<Div Style=@($"position: relative; height:{ViewHeight}vh; width:{ViewWidth}vw;")>
    <LineChart @ref="lineChart" TItem="double" Clicked="@OnClicked"  Options="@chartOptions"/>
</Div>

(notelineChart引用),并在Razor.cs文件中定义了一个lineChart变量(在Razor Page中用作Ref)

LineChart<double> lineChart;

问题是,当我把它放在没有foreach的页面上时,一切都工作正常。

<ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@items></ChartComponent>

但是现在我想在页面中添加多个这样的组件。

@foreach (string graphSelector in datasets)
{
     <ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(items.Where(p => p.CounterInstance == graphSelector).ToList())></ChartComponent>
}

但是当我把它放在foreach中时,我会得到一个错误,说明lineChart为null...我已经尝试了几种方法,但我猜我缺少了一些东西。
在chart组件中我做的

await lineChart.Clear();

这给了我一个
未将对象引用设置为对象的示例。
尝试了几种方法,但不知道如何解决。
我尝试了MetinYakar.NET提出的解决方案,但仍然得到了相同的结果。

图表组件不为空,但图表组件中的某些变量为空。
看起来,当组件在第一次呈现期间位于页面上时,它将工作,但当组件在第一次呈现期间不在页面上时,组件没有正确初始化,图表本身的呈现将失败。
我在ChartComponent中有以下代码。

private async Task DataSetToChartSeries()
        {
            // Create a list of date labels
            string[] dateLabels = Items.Select(x => x.TimeRun.ToString("yyyy-MM-dd hh:mm")).Distinct().ToArray();
            await lineChart.Clear();
            await lineChart.AddLabels(dateLabels);
            if (Multiple == true)
            {
                List<string> datasets = Items.Select(p => p.CounterInstance).Distinct().ToList();
                foreach (string graphSelector in datasets)
                {
                    List<QueryResult> graphDataSet = Items.Where(p => p.CounterInstance == graphSelector).ToList();
                    await lineChart.AddDataSet(GetLineChartDataset(graphDataSet));
                }
            }
            else
            {
                await lineChart.AddDataSet(GetLineChartDataset(Items));
            }
            await lineChart.Update(); <-- This line causes the error
        }

我也有这个在剃刀文件:

@* Does not work*@
@*    @foreach (string key in chartSeries.Keys)
    {
        <ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20"  Multiple=true Items=@(GetChartSeries(key))></ChartComponent>
    }*@
    @*This does work but is not dynamic*@
    <ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20"  Multiple=true Items=@(GetChartSeries("Error"))></ChartComponent>
    <ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20"  Multiple=true Items=@(GetChartSeries("Information"))></ChartComponent>
    <ChartComponent ViewHeight=20 ViewWidth=80 ColorScheme="Classic20"  Multiple=true Items=@(GetChartSeries("Warning"))></ChartComponent>

该问题与第一次呈现项目时图表不存在有关。

3zwjbxry

3zwjbxry1#

你需要在blazor项目中使用一个属性值并添加第一个声明。

LineChart<double> lineChart { get; set; } = new LineChart<double>();

并为视图中的显示选中null

@if(datasets?.Count > 0){
    @foreach (string graphSelector in datasets)
    {
         <ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(items.Where(p => p.CounterInstance == graphSelector).ToList())></ChartComponent>
    }
 } else {
    <b>datasets object null or empty</b>
}
jdg4fx2g

jdg4fx2g2#

Items=@(items.Where(p => p.CounterInstance == graphSelector)在我看来有点可疑。CounterInstance是字符串吗?字符串graphSelector中有什么?我认为这些听起来都不像是字符串。
你抱怨说

@foreach (string graphSelector in datasets)
{
     <ChartComponent ViewHeight=50 ViewWidth=80 ColorScheme="Classic20" Multiple=true Items=@(items.Where(p => p.CounterInstance == graphSelector).ToList())></ChartComponent>
}

会产生lineChartnull的错误,但<ChartComponent>中没有类似的内容

biswetbf

biswetbf3#

好了,谢谢你们的帮助.
我接受了Henk的建议,从Blazorise图表示例的代码库开始,我像使用自己的组件一样 Package 它,令我惊讶的是,我可以在页面中添加多个这样的代码。
经过大量的跟踪和尝试,最重要的变化是我将图表的初始化移到了OnAfterRenderAsync。

protected override async Task OnAfterRenderAsync( bool firstRender )
    {
        if ( firstRender )
        {
            await DataSetToChartSeries();
        }
    }

这让一切都不同了

相关问题