我很努力地使用ReactiveUI用例,我覺得它很簡單,必須有「開箱即用」的支持。但我找不到它。取消並重新執行ReactiveCommand
的場景是具有這些特徵的基本搜索界面:
- 其中用戶輸入的搜索文本
- 其中結果被呈現
- 示出的指標的結果的TextBox搜索字符串文本框搜索過程中
搜索應該像這樣工作:
- 搜索字符串TextBox受到限制,因此在不活動500ms後,將啓動搜索操作。
- 每次啓動新的搜索時,應該取消正在進行的任何搜索操作。
基本上我試圖擴展「強大的例子」來取消當前正在執行的命令,然後開始一個新的命令。
看起來夠簡單嗎?是的,但是我無法使用ReactiveCommand正確使用它。這是我的:
var searchTrigger = this.WhenAnyValue(vm => vm.SearchString)
.Throttle(TimeSpan.FromMilliseconds(500))
.Publish().RefCount();
var searchCmd = ReactiveCommand.CreateFromObservable(
() => Observable
.StartAsync(ct => CancellableSearch(SearchString, ct))
.TakeUntil(searchTrigger));
searchCmd.ToPropertyEx(this, vm => vm.Result);
searchCmd.IsExecuting.ToPropertyEx(this, vm => vm.IsSearching);
searchTrigger.Subscribe(_ => searchCmd.Execute(Unit.Default).Subscribe());
上述代碼適用於除了searchCmd.IsExecuting
以外的所有方面。無論searchCmd.CanExecute
的狀態如何,我都會開始新的搜索。這使得IsExecuting
不可靠,因爲它假設串行操作的命令。我不能使用InvokeCommand
而不是Execute
,因爲在搜索過程中新搜索不會啓動。
我目前有一個沒有ReactiveCommand
的工作解決方案。但我有強烈的感覺,這個簡單的使用案例應該以直接的方式使用ReactiveCommand
來支持。我錯過了什麼?
很棒的回答。謝謝。序列化操作確實是一種選擇。但由於取消可能需要一段時間才能完成,我寧願只是「忘記」正在進行的操作並立即開始新的操作。 –