Files
Samuele Locatelli 08e037ac45 Spostamento progetti
2026-03-27 10:31:53 +01:00

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);
}
}