PalBo
PalBo

Reputation: 2592

Blazor server StateHasChanged() does not refresh data

I am struggling to get my Blazor components to rerender after updating some data. In my component I have a list of teams and each team has a list of team members. I can click on a delete button on each team to remove that member from the team. This works fine, except that the page does not refresh after deleting. I have tried setting StateHasChanged() normally. I have tried overriding ShouldRender() as shown below. I have tried using InvokeAsync(StateHasChanged), but nothing rerenders my page. The only thing I have found that refreshes the data is manually refreshing the team member list by calling the code in OnInitializedAsync() again. I have also tried doing this through a notifier service to update data across components, but it seems like StateHasChanged() does absolutely nothing. Any ideas?

@code {

    [Parameter]
    public Team? Team { get; set; }

    private List<Member?>? TeamMembers { get; set; }
    
    private bool _forceRerender;


    protected override async Task OnInitializedAsync()
    {
        var teamMembers = await _teamService.GetTeamMembers(Team);
        if (teamMembers != null) TeamMembers = teamMembers.ToList();
    }

    private async Task HandleRemoveTeamMember(BsonObjectId memberId, string timeStamp)
    {
        await _teamService.RemoveMember(Team.Id, memberId, timeStamp);

        _forceRerender = true;
        StateHasChanged();
    }
    
    protected override bool ShouldRender()
    {
        if (_forceRerender)
        {
            _forceRerender = false;
            return true;
        }
        return base.ShouldRender();
    }

Upvotes: 2

Views: 8056

Answers (1)

klekmek
klekmek

Reputation: 563

You are not updating your TeamMembers object after removing it by calling the _teamService.RemoveMember() method.

Add some logic to remove the entry in your TeamMembers list and THEN call StateHasChanged().

Somthing like

TeamMembers.RemoveAll(x => x.MemberId == memberId);
StateHasChanged();

Upvotes: 2

Related Questions