if / else 표현식이 재평가되는 원인은 무엇입니까?

asp.net-core blazor c#

문제

블레이저 호스팅 템플릿을 사용하여, 내 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
@if(userInfo.Name == "bob")
{
    <div class="login-panel">
        <p>Hi Bob!</p>
    </div>
}
else
{
    <LoginPanel />
}

그러나 로그인하면 MainLayout.cshtml의 '로그인 패널'이 변경되지 않습니다. 모든 것이 하나의 파일에 있고 특정 변수가 null인지 아닌지 ( 여기 참조) 만 확인하면 Blazor 프레임 워크에 특정 조건이있어 페이지를 불법으로 다시 작성한다고 가정합니다. 그러한 블록을 평가하십시오. 정확합니까? 그렇다면이 재평가를 강제하는 가장 좋은 방법은 무엇입니까?

편집 : 나는 조금 더 주변에서 놀았습니다. 결국 StateHasChanged protected 멤버 함수가 발견되었습니다.이 멤버 함수는 Init가 완료된 후에 호출됩니다. 따라서 이전 예제가 작동하는 이유는 무엇입니까? 작동 솔루션은 내 UserInfo 객체가 INotifyPropertyChanged 구현 한 다음 MainLayout.cshtml에 Change Handler를 등록하여 StateHasChanged() 를 호출하여 로그인 상태가 변경 될 때 업데이트해야하는 뷰를 호출하는 StateHasChanged() 입니다.

수락 된 답변

예. Blazor는 INotifyPropertyChanged 처럼 StateHasChanged 라는 것을 사용합니다.

하지만 차이점은 XAML 프레임 워크에서 XAMLINotifyPropertyChanged 를 호출 한 속성 업데이트하지만 Razor에서는 StateHasChanged 가 호출 될 때 UI 프레임 워크가 요소의 전체 UI 트리를 새로 고 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




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.