-
Notifications
You must be signed in to change notification settings - Fork 80
Add new kb article combobox-virtualization-loader #3123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+130
−0
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
--- | ||
title: Display Loading Indicator in ComboBox with Remote Data and Virtualization | ||
description: Learn how to add a loading indicator in the TelerikComboBox component when using remote data and virtualization functionality in UI for Blazor. | ||
type: how-to | ||
page_title: Adding Loader to ComboBox During Remote Data Fetch and Virtualization | ||
slug: combobox-kb-virtualization-loader | ||
position: | ||
tags: blazor, combobox, loader, templates, nodatatemplate, headertemplate | ||
res_type: kb | ||
ticketid: 1693304 | ||
--- | ||
|
||
## Environment | ||
|
||
<table> | ||
<tbody> | ||
<tr> | ||
<td>Product</td> | ||
<td>ComboBox for Blazor</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
|
||
## Description | ||
|
||
When using the [ComboBox](slug:components/combobox/overview) component in UI for Blazor with remote data loading and virtualization, the dropdown briefly displays the "No data" message while waiting for the response. This behavior can confuse users who may assume there is no data available when it is still loading. Additionally, during virtual scrolling or filtering, the absence of a loading indicator can lead to user frustration as they cannot perceive ongoing data fetch operations. | ||
|
||
## Solution | ||
|
||
1. Display a Loading Indicator During Remote Data Fetch | ||
Use the `HeaderTemplate` property of the ComboBox component to show a loading indicator. Add a boolean flag to track the loading state and update it dynamically during data fetch operations. Use a CSS rule to disable the default "No Data" message. | ||
|
||
2. Clear Old Items During Filtering/Search | ||
Modify the visibility of old items using CSS rules and conditionally toggle their appearance based on the loading state. | ||
|
||
>caption Display a Loading Indicator When Using a Virtualized ComboBox | ||
|
||
```razor | ||
@using Telerik.DataSource | ||
@using Telerik.DataSource.Extensions | ||
|
||
<p>@SelectedValue</p> | ||
|
||
@if (IsLoading) { | ||
<style> | ||
.example-cb .k-list-item { | ||
visibility: hidden; | ||
pointer-events: none; | ||
} | ||
|
||
.example-cb .k-nodata { | ||
display: none; | ||
} | ||
</style> | ||
} | ||
<TelerikComboBox @ref="ComboBoxRef" TItem="@Person" TValue="@int" | ||
ScrollMode="@DropDownScrollMode.Virtual" | ||
OnRead="@GetRemoteData" | ||
ValueMapper="@GetModelFromValue" | ||
ItemHeight="30" | ||
PageSize="20" | ||
TextField="@nameof(Person.Name)" | ||
ValueField="@nameof(Person.Id)" | ||
@bind-Value="@SelectedValue" | ||
Filterable="true" FilterOperator="@StringFilterOperator.Contains"> | ||
<ComboBoxSettings> | ||
<ComboBoxPopupSettings Class="example-cb" Height="200px" /> | ||
</ComboBoxSettings> | ||
<NoDataTemplate> | ||
</NoDataTemplate> | ||
<HeaderTemplate> | ||
<TelerikLoader Visible="@IsLoading" /> | ||
</HeaderTemplate> | ||
</TelerikComboBox> | ||
|
||
@code{ | ||
private TelerikComboBox<Person, int>? ComboBoxRef { get; set; } | ||
private int SelectedValue { get; set; } = 1234; // pre-select an item to showcase the value mapper | ||
private List<Person> AllData { get; set; } | ||
|
||
private bool IsLoading { get; set; } | ||
|
||
private async Task GetRemoteData(ComboBoxReadEventArgs args) | ||
{ | ||
IsLoading = true; | ||
ComboBoxRef?.Refresh(); | ||
await LoadData(); | ||
|
||
var result = AllData.ToDataSourceResult(args.Request); | ||
|
||
// set the Data and the TotalItems to the current page of data and total number of items | ||
args.Data = result.Data; | ||
args.Total = result.Total; | ||
IsLoading = false; | ||
ComboBoxRef?.Refresh(); | ||
} | ||
|
||
private async Task<Person?> GetModelFromValue(int selectedValue) | ||
{ | ||
await Task.Delay(400); // simulate real network and database delays. Remove in a real app | ||
|
||
return AllData.FirstOrDefault(x => selectedValue == x.Id); | ||
} | ||
|
||
private async Task LoadData() | ||
{ | ||
await Task.Delay(1500); | ||
if (AllData == null) | ||
{ | ||
AllData = Enumerable.Range(1, 12345).Select(x => new Person { Id = x, Name = $"Name {x}" }).ToList(); | ||
} | ||
} | ||
|
||
public class Person | ||
{ | ||
public int Id { get; set; } | ||
public string Name { get; set; } | ||
} | ||
} | ||
``` | ||
|
||
### Key Points | ||
- Use the `HeaderTemplate` for displaying a loading indicator during scrolling or filtering. | ||
- Call the `Refresh` method on the ComboBox reference to update the UI dynamically during data load operations. | ||
- Toggle visibility of old items using CSS to enhance user experience. | ||
|
||
## See Also | ||
- [ComboBox HeaderTemplate Documentation](slug:components/combobox/templates#header-template) | ||
- [ComboBox Reference and Methods](slug:components/combobox/overview#combobox-reference-and-methods) | ||
- [ComboBox Virtualization Documentation](slug:combobox-virtualization#remote-data-example) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.