反应式 UI "Compelling Example"如何刷新搜索结果



我的问题是关于ReactiveUI给出的"令人信服的例子",当一个人在搜索栏中输入时,搜索是异步发生的。假设我想为用户提供一种刷新当前搜索结果的方法。我可以让他们在搜索栏中退格并重新输入他们的最后一个字符。但是,他们要求"刷新"按钮,因为如何刷新当前结果对他们来说并不明显。

我想不出如何在示例的上下文中执行此操作:

public class TheViewModel : ReactiveObject
{
    private string query;
    private readonly ObservableAsPropertyHelper<List<string>> matches;
    public TheViewModel()
    {
        var searchEngine = this.ObservableForProperty(input => input.Query)
                .Value()
                .DistinctUntilChanged()
                .Throttle(TimeSpan.FromMilliseconds(800))
                .Where(query => !string.IsNullOrWhiteSpace(query) && query.Length > 1);
        var search = searchEngine.SelectMany(TheSearchService.DoSearchAsync);
        var latestResults =
            searchEngine.CombineLatest(search, (latestQuery, latestSearch) => latestSearch.Query != latestQuery ? null : latestSearch.Matches)
                .Where(result => result != null);
        matches = latestResults.ToProperty(this, result => result.Matches);
    }
    public string Query
    {
        get
        {
            return query;
        }
        set
        {
            this.RaiseAndSetIfChanged(ref query, value);
        }
    }
    public List<string> Matches
    {
        get
        {
            return matches.Value;
        }
    }
} 

有没有人对如何从按钮捕获命令并在不清除当前搜索文本的情况下重新执行现有搜索有任何建议?

您可以将

Query更改的现有可观察量与新的可观察量合并,该可观察量在按下刷新按钮时返回当前Query

首先是刷新按钮的命令:

public ReactiveCommand<Unit, String> Refresh { get; private set; }

然后,创建命令并分配它,并创建两个可观察量的合并可观察量:

Refresh = ReactiveCommand.Create<Unit, String>(() => Query);
var searchEngine = Observable.Merge(
    this.ObservableForProperty(input => input.Query).Value().DistinctUntilChanged(),
    Refresh)
        .Throttle(TimeSpan.FromMilliseconds(800))
        .Where(query => !string.IsNullOrWhiteSpace(query) && query.Length > 1);

其余的可以保持不变。

最新更新