Skip to content

Commit c2dcc2e

Browse files
authored
feat(Select): use DynamicElement ensure release event callback (#7894)
1 parent 54f2347 commit c2dcc2e

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/BootstrapBlazor/Components/Select/Select.razor

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@namespace BootstrapBlazor.Components
1+
@namespace BootstrapBlazor.Components
22
@using Microsoft.AspNetCore.Components.Web.Virtualization
33
@typeparam TValue
44
@inherits SimpleSelectBase<TValue>
@@ -22,7 +22,8 @@
2222
}
2323
else
2424
{
25-
<input type="text" id="@InputId" disabled="@Disabled" placeholder="@PlaceHolder" class="@InputClassString" value="@SelectedRow?.Text" @onchange="OnChange" readonly="@ReadonlyString" />
25+
<input type="text" id="@InputId" disabled="@Disabled" placeholder="@PlaceHolder" class="@InputClassString"
26+
value="@SelectedRow?.Text" @onchange="@_onChangeEventCallback" readonly="@ReadonlyString" />
2627
}
2728
<span class="@AppendClassString"><i class="@DropdownIcon"></i></span>
2829
</div>
@@ -92,7 +93,7 @@
9293

9394
@code {
9495
RenderFragment<SelectedItem> RenderRow => item =>
95-
@<div class="@ActiveItem(item)" @onclick="() => OnClickItem(item)">
96+
@<DynamicElement class="@ActiveItem(item)" OnClick="() => OnClickItem(item)">
9697
@if (ItemTemplate != null)
9798
{
9899
@ItemTemplate(item)
@@ -105,7 +106,7 @@
105106
{
106107
@item.Text
107108
}
108-
</div>;
109+
</DynamicElement>;
109110

110111
RenderFragment<PlaceholderContext> RenderPlaceHolderRow => context =>
111112
@<div class="dropdown-item">

src/BootstrapBlazor/Components/Select/Select.razor.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ public bool IsUseActiveWhenValueIsNull
202202

203203
private string _defaultVirtualizedItemText = "";
204204

205+
private EventCallback<ChangeEventArgs> _onChangeEventCallback = EventCallback<ChangeEventArgs>.Empty;
206+
205207
private SelectedItem? SelectedItem { get; set; }
206208

207209
private SelectedItem? SelectedRow
@@ -234,6 +236,10 @@ protected override void OnParametersSet()
234236
NoSearchDataText ??= Localizer[nameof(NoSearchDataText)];
235237
DropdownIcon ??= IconTheme.GetIconByKey(ComponentIcons.SelectDropdownIcon);
236238
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.SelectClearIcon);
239+
240+
_onChangeEventCallback = IsEditable
241+
? EventCallback.Factory.Create<ChangeEventArgs>(this, OnChange)
242+
: EventCallback<ChangeEventArgs>.Empty;
237243
}
238244

239245
/// <summary>
@@ -389,6 +395,8 @@ private async Task OnClickItem(SelectedItem item)
389395
_defaultVirtualizedItemText = item.Text;
390396
await SelectedItemChanged(item);
391397
}
398+
399+
StateHasChanged();
392400
}
393401

394402
private async Task SelectedItemChanged(SelectedItem item)
@@ -494,11 +502,26 @@ private async Task OnChange(ChangeEventArgs args)
494502
// 修复:使用完整的未过滤列表来查找当前选中项
495503
// 避免在用户搜索时被外部 StateHasChanged 影响导致值被错误修改
496504
var allItems = GetRowsByItems();
497-
505+
498506
var item = GetItemWithEnumValue()
499507
?? allItems.Find(i => i.Value == CurrentValueAsString)
500508
?? allItems.Find(i => i.Active)
501509
?? allItems.Find(i => !i.IsDisabled);
502510
return item;
503511
}
512+
513+
/// <summary>
514+
/// <inheritdoc/>
515+
/// </summary>
516+
/// <param name="disposing"></param>
517+
/// <returns></returns>
518+
protected override ValueTask DisposeAsync(bool disposing)
519+
{
520+
if (disposing)
521+
{
522+
_onChangeEventCallback = EventCallback<ChangeEventArgs>.Empty;
523+
}
524+
525+
return base.DisposeAsync(disposing);
526+
}
504527
}

0 commit comments

Comments
 (0)