Использование Blazor для виртуализации с отложенной загрузкой

#asp.net-core #blazor #webassembly #.net-5

#asp.net-ядро #blazor #webassembly #.net-5

Вопрос:

Я использую Virtualize прямо, но у меня есть несколько вопросов. Я хотел бы отложить загрузку, выполнив выгружаемые вызовы API. Однако нам нужно знать общее количество доступных стран. Если я вызову OnIntialized для GetCountCountries() и сохраню его как закрытую переменную, то, пока вы находитесь в списке прокрутки, вы никогда не узнаете, был ли добавлен новый элемент в страны на этой странице. С другой стороны, если я вызову GetCountriesCount() во время отложенной загрузки LoadContries, тогда я получу самый последний подсчет и список. Однако, если элемент был добавлен в страны, но теоретически был в списке, который уже был отображен (скажем, в алфавитном порядке добавленная страна начиналась с A, а буквы A уже были отображены на странице), тогда вызов get технически получит 1 дублирующуюся запись (последний элемент, выбранный при последнем вызове страницы)

Как правильно использовать виртуализацию? Должен ли он использоваться только для целей рендеринга пользовательского интерфейса и инициализации GetAll()? Я считаю, что использование подкачки через API будет наиболее эффективным с точки зрения API и пользовательского интерфейса.

 <Virtualize Context="country" ItemsProvider="@LoadCountries">
                    <ItemContent>
                        <tr>
                            <td>@country.Id</td>
                            <td>@country.DisplayValue</td>
                            <td style="text-align:right">
                                <a href="@($"Country/{country.Id}")" class="btn btn-primary table-btn">
                                    <i class="fas fa-info-circle"></i>
                                </a>
                                <a href="@($"Country/Edit/{country.Id}")" class="btn btn-primary table-btn">
                                    <i class="fas fa-edit"></i>
                                </a>
                            </td>
                        </tr>
                    </ItemContent>
                    <Placeholder>
                        <Loading />
                    </Placeholder>
                </Virtualize>
 
 private async ValueTask<ItemsProviderResult<Country>> LoadCountries(ItemsProviderRequest request)
        {
            var numCountries = Math.Min(request.Count, totalCountries - request.StartIndex);
            var countries = await CountryService.GetPagedAsync()(request.StartIndex, numCountries, request.CancellationToken);

            return new ItemsProviderResult<Country>(countries, totalCountries);
        }
 

Комментарии:

1. say alphabetically the country added started with A and the A's had already been rendered on the page Реализуете ли вы сортировку на основе DisplayValue вашего метода CountryService GetPagedAsync?

2. Это было бы правильным местом для выполнения этого при вызове постраничного вызова. Вы должны установить порядок перед получением страницы. В противном случае я бы просто извлек 100 из 10000 элементов, заказав только те 100, которые вернулись.