136 lines
3.7 KiB
Plaintext
136 lines
3.7 KiB
Plaintext
@page "/weather"
|
|
@rendermode InteractiveServer
|
|
@attribute [StreamRendering]
|
|
|
|
<PageTitle>Weather</PageTitle>
|
|
|
|
<h1>Weather</h1>
|
|
|
|
<p>This component demonstrates showing data.</p>
|
|
@if (isLoading)
|
|
{
|
|
<p><em>pre-loading...</em></p>
|
|
}
|
|
else
|
|
{
|
|
<p role="status">Current count: @currentCount</p>
|
|
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
|
|
<ExecutionContextTest></ExecutionContextTest>
|
|
|
|
@if (forecasts == null)
|
|
{
|
|
<p><em>Loading...</em></p>
|
|
}
|
|
else
|
|
{
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th aria-label="Temperature in Celsius">Temp. (C)</th>
|
|
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
|
|
<th>Summary</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var forecast in forecasts)
|
|
{
|
|
<tr>
|
|
<td>@forecast.Date.ToShortDateString()</td>
|
|
<td>@forecast.TemperatureC</td>
|
|
<td>@forecast.TemperatureF</td>
|
|
<td>@forecast.Summary</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
}
|
|
}
|
|
|
|
|
|
@code {
|
|
private bool isLoading = false;
|
|
private int currentCount = 0;
|
|
|
|
private void IncrementCount()
|
|
{
|
|
currentCount++;
|
|
Console.WriteLine($"Curr: {currentCount}");
|
|
}
|
|
|
|
private WeatherForecast[]? forecasts;
|
|
|
|
[Inject]
|
|
private IJSRuntime JS { get; set; } = null!;
|
|
|
|
// protected override async Task OnInitializedAsync()
|
|
// {
|
|
// // Simulate asynchronous loading to demonstrate streaming rendering
|
|
// isLoading = true;
|
|
// await InvokeAsync(StateHasChanged);
|
|
// await Task.Delay(400);
|
|
// isLoading = false;
|
|
// await InvokeAsync(StateHasChanged);
|
|
// await Task.Delay(600);
|
|
// LoadForecasts();
|
|
// }
|
|
|
|
private bool _interactiveStarted;
|
|
private bool _loadingStarted;
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (!firstRender) return;
|
|
|
|
// Prova una semplice chiamata JS: se fallisce siamo in prerender
|
|
try
|
|
{
|
|
await JS.InvokeVoidAsync("console.debug", "client active check");
|
|
_interactiveStarted = true;
|
|
}
|
|
catch
|
|
{
|
|
_interactiveStarted = false;
|
|
}
|
|
|
|
if (_interactiveStarted && !_loadingStarted)
|
|
{
|
|
_loadingStarted = true;
|
|
await StartLoadingAsync(); // avvia il lavoro "pesante" solo qui
|
|
}
|
|
}
|
|
private async Task StartLoadingAsync()
|
|
{
|
|
// esempio: simulazione caricamento
|
|
isLoading = true;
|
|
StateHasChanged();
|
|
await Task.Delay(400);
|
|
isLoading = false;
|
|
StateHasChanged();
|
|
await Task.Delay(600);
|
|
// carica i dati veri
|
|
LoadForecasts();
|
|
StateHasChanged();
|
|
}
|
|
|
|
private void LoadForecasts()
|
|
{
|
|
var startDate = DateOnly.FromDateTime(DateTime.Now);
|
|
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
|
|
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
|
{
|
|
Date = startDate.AddDays(index),
|
|
TemperatureC = Random.Shared.Next(-20, 55),
|
|
Summary = summaries[Random.Shared.Next(summaries.Length)]
|
|
}).ToArray();
|
|
}
|
|
|
|
private class WeatherForecast
|
|
{
|
|
public DateOnly Date { get; set; }
|
|
public int TemperatureC { get; set; }
|
|
public string? Summary { get; set; }
|
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
|
}
|
|
}
|