I have a component called DataPageComponent
. It essentially has a data range and a search button. With a list of GraphComponents
.
When I hit that search button I need to tell all the children GraphComponent
to do a http request and fetch their new data.
<div class="py-2">
<MudDatePicker @bind-value="dateTime" />
<MudButton OnClick="OnSearchClicked">Search</MudButton>
</div>
@foreach (var group in Groups)
{
<MudPaper Class="mt-2 pt-2 pb-4">
<MudText Class="pl-2" Typo="Typo.h3">@group.Title</MudText>
<GenericModbusGraphComponent Group="@group" Model="QueryModel" />
</MudPaper>
}
@code {
[Parameter, EditorRequired]
public long DeviceId { get; set; }
[Parameter, EditorRequired]
public List<DeviceGroupDto> Groups { get; set; }
private DateTime dateTime { get; set; }
private SensorQueryModel QueryModel { get; set; }
protected override async Task OnInitializedAsync()
{
var offset = await _tzService.GetLocalDateTime(DateTimeOffset.UtcNow);
//Default Query Model
QueryModel = new SensorQueryModel
{
SensorId = DeviceId,
DateTo = DateTime.Now,
DateFrom = DateTime.Now.AddDays(-7),
Interval = Global.TenMinInSeconds,
TimeZoneOffset = offset.Offset.Hours
};
}
private async Task OnSearchClicked()
{
foreach (var views in Groups.Where(x => x.ViewReferenceGraphs != null))
{
await ((GenericModbusGraphComponent)views.ViewReferenceGraphs).UpdateData(QueryModel);
//Note: Each child will call update view on thier own, no need to do it here
}
}
}
Now I have horribly confused myself, but all my graphs are now loading synchronously, and I need each graph component to run its own http get and render its view independently.
How am I meant to correctly tell each child component to update its data and then view each in their own thread.
Here is the code for my renderGraphComponent.
@if (Loading)
{
<LoadingIcon />
}
else
{
<SimpleChartComponent DataSet="_response" Heading="@Group.Title"></SimpleChartComponent>
}
@code {
[Parameter]
public SensorQueryModel Model { get; set; }
[Parameter]
public DeviceGroupDto Group { get; set; }
private List<XyStatsResponse> _response;
private bool Loading { get; set; } = false;
protected override async Task OnInitializedAsync()
{
//Only load data one time.
if (_response == null && Loading == false)
{
if (Model != null)
{
await UpdateData();
}
}
}
// used to externally update the graph data
public async Task UpdateData(SensorQueryModel model)
{
Model = model;
Loading = true;
StateHasChanged();
//Make query
var queryModel = new SensorGroupQueryModel
{
SensorId = Model.SensorId,
DateFrom = Model.DateFrom,
DateTo = Model.DateTo,
TimeZoneOffset = Model.TimeZoneOffset,
Group = Group.Title,
Interval = Model.Interval
};
_response = await _repository.GetHistoryDataForGroup(queryModel);
//State has change due to loading signs and hopefully response data
Loading = false;
StateHasChanged();
}