diff --git a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor index 7cb4d6f865f..bbea8d05ecf 100644 --- a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor +++ b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor @@ -5,13 +5,13 @@ { } -
+
diff --git a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs index fd9784285cf..e8f836b7d0b 100644 --- a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs +++ b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs @@ -12,12 +12,6 @@ namespace BootstrapBlazor.Components; /// public partial class AutoComplete { - /// - /// Gets the component style - /// - private string? ClassString => CssBuilder.Default("auto-complete") - .Build(); - /// /// Gets or sets the collection of matching data obtained by inputting a string /// @@ -179,14 +173,26 @@ public override async Task TriggerFilter(string val) [JSInvokable] public override Task TriggerChange(string val) { + // client input does not need to be re-rendered to prevent jitter when the network is congested _render = false; + CurrentValue = val; + _render = true; + _dropdown.Render(); + return Task.CompletedTask; + } + + /// + /// TriggerChange method + /// + /// + [JSInvokable] + public Task TriggerDeleteCallback(string val) + { CurrentValue = val; if (!ValueChanged.HasDelegate) { StateHasChanged(); } - _render = true; - _dropdown.Render(); return Task.CompletedTask; } } diff --git a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.js b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.js index 1300fdd8b0d..a917c780048 100644 --- a/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.js +++ b/src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.js @@ -157,6 +157,11 @@ const handlerKeyup = (ac, e) => { current.classList.add('active'); scrollIntoView(el, current); } + else if (key === 'Backspace' || key === 'Delete') { + if (input.getAttribute('data-bb-trigger-delete') === 'true') { + invoke.invokeMethodAsync('TriggerDeleteCallback', input.value); + } + } } export function showList(id) { diff --git a/test/UnitTest/Components/AutoCompleteTest.cs b/test/UnitTest/Components/AutoCompleteTest.cs index 37e7f7089e3..821b5f79eb5 100644 --- a/test/UnitTest/Components/AutoCompleteTest.cs +++ b/test/UnitTest/Components/AutoCompleteTest.cs @@ -3,14 +3,12 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone -using Microsoft.AspNetCore.Components.Web; - namespace UnitTest.Components; public class AutoCompleteTest : BootstrapBlazorTestBase { [Fact] - public void Items_Ok() + public async Task Items_Ok() { var cut = Context.RenderComponent(pb => { @@ -18,6 +16,8 @@ public void Items_Ok() pb.Add(a => a.IsSelectAllTextOnEnter, true); }); Assert.Contains("
cut.Instance.TriggerDeleteCallback("Test")); + Assert.Equal("Test", cut.Instance.Value); } [Fact]