Что вызывает переоценку выражений if/else?

avatar
Rollie
8 апреля 2018 в 02:02
755
1
0

При работе с шаблоном, размещенным в Blazor, в моем файле MainLayout.cshtml есть что-то вроде:

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

, а затем в отдельном файле Login.cshtml:

@inject UserInfo userInfo
async void Login()
{
    userInfo.Name = "bob";
}

Но вход в систему не приводит к изменению "панели входа" в MainLayout.cshtml. Мне удалось заставить это работать, если все находится в одном файле, и я только проверяю, является ли конкретная переменная нулевой или нет (см. здесь), поэтому я предполагаю, что платформа Blazor имеет определенные критерии, которые запрещать страницу для переоценки таких блоков. Это точно? Если да, то как лучше всего провести повторную оценку?

Редактировать: я немного поиграл с этим, в конце концов обнаружил защищенную функцию-член StateHasChanged, которая, как я полагаю, вызывается после завершения Init, поэтому предыдущий пример работает. Я думаю, что рабочее решение состоит в том, чтобы мой объект UserInfo реализовал INotifyPropertyChanged, а затем зарегистрировал обработчик изменений внутри MainLayout.cshtml для вызова StateHasChanged() для представлений, которые необходимо обновлять при изменении статуса входа в систему.

Источник

Ответы (1)

avatar
VibeeshanRC
8 апреля 2018 в 14:22
2

Да. Blazor использует что-то под названием StateHasChanged точно так же, как INotifyPropertyChanged.

Однако разница в том, что в Xaml Frameworks XAML <1804604154> только Обновить эти свойства, которые называют INotifyPropertyChanged, но в бритве, когда StateHasChanged называется инфраструктурой пользовательского интерфейса, которая обновит все дерево пользовательского интерфейса компонента (по крайней мере на данный момент), в котором находится элемент. Тогда кто звонил StateHasChanged, если это сделали не вы. Когда элемент получает ввод (вы нажимаете кнопку), blazor автоматически устанавливает StateHasChanged под капотом.

Больше прочтений"

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