Was bewirkt, dass if / else-Ausdrücke erneut ausgewertet werden?

asp.net-core blazor c#

Frage

In meiner MainLayout.cshtml-Datei habe ich so etwas wie:

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

und dann in einem separaten Login.cshtml:

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

Die Anmeldung führt jedoch nicht zu einer Änderung des Anmeldebereichs in MainLayout.cshtml. Ich konnte das zum Laufen bringen, wenn alles in einer einzigen Datei ist und ich nur nach einer bestimmten Variablen suche (siehe hier ), also nehme ich an, dass das Blazor-Framework bestimmte Kriterien hat, die eine Seite dazu berechtigen, werte solche Blöcke aus. Ist das genau? Wenn ja, was ist der beste Weg, diese Neubewertung zu erzwingen?

Edit: Ich spielte ein bisschen mehr herum, entdeckte schließlich die StateHasChanged Protected Member-Funktion, von der ich StateHasChanged , dass sie nach Init aufgerufen wird, also warum das vorherige Beispiel funktioniert. Ich denke , eine funktionierende Lösung ist mein haben UserInfo - Objekt implementieren INotifyPropertyChanged , und dann eine Änderung Handler innerhalb MainLayout.cshtml registrieren nennen StateHasChanged() für Ansichten , die aktualisiert werden müssen, wenn Änderungen Login - Status.

Akzeptierte Antwort

Ja. Blazor verwendet etwas namens StateHasChanged genau wie INotifyPropertyChanged .

Jedoch ist der Unterschied, in XAML Frameworks der XAML nur diejenigen Eigenschaften aktualisieren , die aufgerufen hat INotifyPropertyChanged , aber in Rasiermesser wenn StateHasChanged wird der UI - Framework wird aktualisiert den gesamten UI Baum der Komponente (zumindest ab jetzt) das Element genannt residiert . Wer hat dann den StateHasChanged wenn es nicht von dir gemacht wird. Wenn ein Element eine Eingabe erhält (Sie klicken auf eine Schaltfläche), wird der Blazor automatisch den StateHasChanged unter der Haube setzen.

Mehr liest "

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

https://learn-blazor.com/pages/datenbindung/

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

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




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum