StateHasChanged не обнаруживает изменения в первый раз - PullRequest
5 голосов
/ 11 марта 2020

Похоже, что StateHasChanged() запускает повторный рендеринг компонента только после операции ожидания задачи (найдено здесь ).

Так что я хочу использовать только StateHasChanged для повторного рендеринга вместо использования Task.delay или Task.Run.

Вот мой код:

protected async Task ClearSearch()
        {
            SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
            IsBusy = true;
            TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();
            StateHasChanged();  // << -------- **FIRST TIME** 
            //await Task.Delay(TimeSpan.FromSeconds(1));
            await GetTestCouponGroups(SearchTestCoupon);
        }

 protected async Task GetTestCouponGroups(object args)
        {
                TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
                IsRowSelected = false;
                IsBusy = false;
                StateHasChanged(); // << -------- **SECOND TIME**
        }

Здесь я использую загрузчик, который активируется с помощью IsBusy. Но он не работает в первый раз, когда StateHasChanged вызывается, как указано в коде.

Но он воспроизводит компонент, как и ожидалось, во второй раз.

Я использовал Task.Delay, но это нарушает другие мои функции, такие как очистка сетки и отображение искомых данных и т. д. c.

1 Ответ

1 голос
/ 11 марта 2020

StateHasChanged не выполняет повторную визуализацию компонента, компонент выполняет повторную визуализацию после завершения делегатов событий (OnClick, OnMouseMouve...).

Так что в вашем случае, если вы хотите выполнить повторную визуализацию компонента на первом StateHasChanged ваш код должен быть:

protected void ClearSearch()
        {
            SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
            IsBusy = true;
            TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();            
            GetTestCouponGroups(SearchTestCoupon); // don't await 
            StateHasChanged();  // << -------- **FIRST TIME** 
        }

 protected async Task GetTestCouponGroups(object args)
        {
                TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
                IsRowSelected = false;
                IsBusy = false;
                StateHasChanged(); // << -------- **SECOND TIME**
        }
...