我想检查输入的用户名是否已存在于数据库中。我有一个异步查询,但我不想在每个输入字符后检查它,而是在输入完成后 1 秒检查。
这是我到目前为止所得到的:
[Reactive]
public string? Username{ get; set; }
[ObservableAsProperty]
public bool IsUsernameExists{ get; }
...
this.WhenAnyValue(x => x.Username)
.Throttle(TimeSpan.FromMilliseconds(1000))
.Select(x => this.UserNameExists.ExecuteAsync(x))
.Select(x => x.Result)
.ToPropertyEx(this, vm => vm.IsUsernameExists);
this.ValidationRule(x => x.Username, x => !this.IsUsernameExists, "Username already exists.");
问题是,当用户名更改时,由于延迟,验证会在更新之前评估 IsUsernameExists。所以验证总是在输入后面 1 个字符。 有谁知道这个问题的解决方案吗?
提前致谢, 伊姆雷·霍尔瓦特
我已经成功了:
this.ValidationRule(
vm => vm.Name,
this.WhenAnyValue(x => x.Name)
.Throttle(TimeSpan.FromSeconds(0.7), RxApp.TaskpoolScheduler)
.SelectMany(async x => (await this.BankNameExists.ExecuteAsync(x)) == true ?
new ValidationState(false, "Name already exists.") : ValidationState.Valid)
.ObserveOn(RxApp.MainThreadScheduler));