Lavorando sul modello ospitato da Blazor, nel mio MainLayout.cshtml, ho qualcosa del tipo:
@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
<div class="login-panel">
<p>Hi Bob!</p>
</div>
}
else
{
<LoginPanel />
}
e quindi in un separato Login.cshtml:
@inject UserInfo userInfo
async void Login()
{
userInfo.Name = "bob";
}
Ma l'accesso non causa una modifica al "pannello di login" in MainLayout.cshtml. Sono stato in grado di farlo funzionare se tutto è in un unico file e sto solo verificando se una particolare variabile è nullo o no (vedi qui ), quindi presumo che il framework Blazor abbia criteri specifici che illecano una pagina valutare tali blocchi. È accurato? In tal caso, qual è il modo migliore per forzare questa rivalutazione?
Modifica: Ho giocato un po 'di più, alla fine StateHasChanged
scoperto la funzione membro protetto StateHasChanged
, che presumo viene chiamata dopo che Init è stato completato, quindi perché l'esempio precedente funziona. Credo che una soluzione di lavoro è quella di avere il mio UserInfo
oggetto implementare INotifyPropertyChanged
, e quindi registrare un gestore di cambiamento all'interno MainLayout.cshtml chiamare StateHasChanged()
per le viste che hanno bisogno di aggiornare quando lo stato di accesso.
Sì. Blazor usa qualcosa chiamato StateHasChanged
proprio come INotifyPropertyChanged
.
Tuttavia la differenza è, in XAML framework XAML aggiornerà solo quelle proprietà che ha chiamato INotifyPropertyChanged
, ma nel rasoio quando StateHasChanged
è chiamato il quadro UI aggiornerà tutto l'albero UI del componente (almeno fin d'ora) dell'elemento risiede . Quindi chi ha chiamato StateHasChanged
se non è stato fatto da te. Quando un elemento riceve un input (Stai facendo clic su un pulsante), il blazer imposterà automaticamente lo StateHasChanged
sotto il cofano.
Altre letture "
https://github.com/aspnet/Blazor/issues/409
https://learn-blazor.com/pages/data-binding/