@@ -119,12 +119,20 @@ public partial class AutoFill<TValue>
119119 [ Parameter ]
120120 public Func < Task > ? OnClearAsync { get ; set ; }
121121
122+ /// <summary>
123+ /// 获得/设置 输入框内容无效时是否自动清空内容 默认 false
124+ /// </summary>
125+ [ Parameter ]
126+ public bool IsAutoClearWhenInvalid { get ; set ; }
127+
122128 [ Inject ]
123129 [ NotNull ]
124130 private IStringLocalizer < AutoComplete > ? Localizer { get ; set ; }
125131
126132 private string ? ShowDropdownListOnFocusString => ShowDropdownListOnFocus ? "true" : null ;
127133
134+ private string ? TriggerBlurString => ( OnBlurAsync != null || IsAutoClearWhenInvalid ) ? "true" : null ;
135+
128136 private string ? _displayText ;
129137
130138 private List < TValue > ? _filterItems ;
@@ -175,7 +183,20 @@ protected override void OnParametersSet()
175183 /// <inheritdoc/>
176184 /// </summary>
177185 /// <returns></returns>
178- protected override Task InvokeInitAsync ( ) => InvokeVoidAsync ( "init" , Id , Interop , _displayText ) ;
186+ protected override Task InvokeInitAsync ( ) => InvokeVoidAsync ( "init" , Id , Interop , _displayText , nameof ( TriggerChange ) ) ;
187+
188+ private string _clientValue = "" ;
189+
190+ /// <summary>
191+ /// 由客户端 JavaScript 触发
192+ /// </summary>
193+ /// <param name="v"></param>
194+ /// <returns></returns>
195+ [ JSInvokable ]
196+ public void TriggerChange ( string v )
197+ {
198+ _clientValue = v ;
199+ }
179200
180201 private bool IsNullable ( ) => ! ValueType . IsValueType || NullableUnderlyingType != null ;
181202
@@ -275,4 +296,17 @@ public async Task TriggerFilter(string val)
275296 }
276297 _dropdown . Render ( ) ;
277298 }
299+
300+ /// <summary>
301+ /// <inheritdoc/>
302+ /// </summary>
303+ /// <returns></returns>
304+ protected override async Task OnBeforeBlurAsync ( )
305+ {
306+ if ( IsAutoClearWhenInvalid && GetDisplayText ( Value ) != _clientValue )
307+ {
308+ CurrentValue = default ;
309+ await InvokeVoidAsync ( "setValue" , Id , "" ) ;
310+ }
311+ }
278312}
0 commit comments