¿Qué causa que las expresiones / else sean reevaluadas?

asp.net-core blazor c#

Pregunta

Trabajando con la plantilla alojada de Blazor, en mi MainLayout.cshtml, tengo algo como:

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

y luego en un Login.cshtml separado:

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

Pero el inicio de sesión no causa un cambio en el 'panel de inicio de sesión' en MainLayout.cshtml. Pude lograr que esto funcionara si todo está en un solo archivo y solo estoy comprobando si una variable en particular es nula o no (vea aquí ), por lo que asumo que el marco Blazor tiene criterios específicos que hacen que una página no sea válida. evaluar tales bloques. ¿Es esto correcto? Si es así, ¿cuál es la mejor manera de forzar esta reevaluación?

Edición: jugué un poco más con él, finalmente descubrí la función de miembro protegido StateHasChanged , a la que supongo que se llama después de que Init se haya completado, de ahí que funcione el ejemplo anterior. Creo que una solución funcional es hacer que mi objeto UserInfo implemente INotifyPropertyChanged y luego registre un controlador de cambios dentro de MainLayout.cshtml para llamar a StateHasChanged() para las vistas que deben actualizarse cuando cambie el estado de inicio de sesión.

Respuesta aceptada

Sí. Blazor usa algo llamado StateHasChanged como INotifyPropertyChanged .

Sin embargo, la diferencia es, en XAML frameworks el XAML sólo actualizará las propiedades que ha llamado INotifyPropertyChanged , pero en la maquinilla de afeitar cuando StateHasChanged se llama el marco de interfaz de usuario se actualizará todo el árbol de interfaz de usuario del componente (al menos por ahora) el elemento está residiendo . Entonces, ¿quién ha llamado a StateHasChanged si no lo ha hecho usted? Cuando un elemento recibe una entrada (estás haciendo clic en un botón), el blazor establecerá automáticamente el StateHasChanged bajo el capó.

Más lee "

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




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué