Qu'est-ce qui cause la réévaluation des expressions si / else?

asp.net-core blazor c#

Question

En travaillant à partir du modèle hébergé par Blazor, dans mon MainLayout.cshtml, j'ai quelque chose comme:

@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>
}
else
{
    <LoginPanel />
}

puis dans un fichier Login.cshtml distinct:

@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>
}
else
{
    <LoginPanel />
}

Mais la connexion ne provoque pas de modification du "panneau de connexion" dans MainLayout.cshtml. J'ai réussi à faire en sorte que cela fonctionne si tout est dans un seul fichier et que je vérifie seulement si une variable particulière est nulle ou non (voir ici ), donc je suppose que le framework Blazor a des critères spécifiques qui illicitent une page. évaluer de tels blocs. Est-ce exact? Si tel est le cas, quel est le meilleur moyen de forcer cette réévaluation?

Edit: j’ai joué un peu plus avec elle, puis découvert la fonction membre protégée StateHasChanged , qui, je suppose, est appelée une fois que Init est terminée, d’où l’exemple précédent. Je pense qu'une solution efficace consiste à faire en sorte que mon objet UserInfo implémente INotifyPropertyChanged , puis enregistre un gestionnaire de modifications dans MainLayout.cshtml pour appeler StateHasChanged() pour les vues devant être StateHasChanged() à jour lorsque le statut de connexion change.

Réponse acceptée

Oui. Blazor utilise quelque chose appelé StateHasChanged tout comme INotifyPropertyChanged .

Toutefois , la différence est, en XAML ossatures XAML ne fera que mettre à jour ces propriétés qui a appelé INotifyPropertyChanged , mais Razor quand StateHasChanged est appelé le cadre de l' interface utilisateur rafraîchira l'arbre entier de l' interface utilisateur du composant (au moins maintenant) l'élément réside . Ensuite, qui a appelé StateHasChanged si ce n'est pas fait par vous. Lorsqu'un élément reçoit une entrée (vous cliquez sur un bouton), le blazor définit automatiquement StateHasChanged sous le capot.

Plus de lectures "

https://github.com/aspnet/Blazor/issues/409

https://learn-blazor.com/pages/data-binding/

https://github.com/aspnet/Blazor/issues/359

https://github.com/aspnet/Blazor/issues/407




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi