簡體   English   中英

SelectMany之后,Observable仍然訂閱

[英]Observable still subscribed after SelectMany

我為WPF應用程序設置了標准反應式ui路由,並且具有ViewModel可以實現以提供標題信息的接口。

public interface IHaveTitle
{
    IObservable<string> Title { get; }
}

在一個視圖模型中,我正在執行以下操作(出於演示目的):

public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString());

在主窗口屏幕中,我正在執行以下操作:

disposer(
    ViewModel.Router.CurrentViewModel
    .SelectMany(vm =>
        ((vm as IHaveTitle)?.Title.StartWith("") ?? 
            Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
    .ObserveOn(RxApp.MainThreadScheduler)
    .BindTo(this, w => w.Title));

其中disposer是傳遞到this.WhenActivated擴展方法中的Action<IDisposable>

現在,當我四處導航時,標題確實會更改以反映UrlPathSegment ,而在主視圖模型上,標題會更新以每5秒顯示一次時間。

但是,我看到的問題是,即使導航到其他視圖模型,在主視圖模型上可觀察到的標題仍會導致標題發生更改。

我的問題確實是:如何預防這種情況? 鑒於我基於CurrentViewModel選擇,當我離開時為什么它不分離?

問題是使用SelectMany 您說的是“每當CurrentViewModel更改時,都訂閱另一個可觀察的對象”。 由於這些可觀測對象永遠不會完成,因此它們將永遠保持“活動”狀態。

相反,您想切換到新的可觀察對象:

disposer(
    ViewModel.Router.CurrentViewModel
    .Select(vm =>
        ((vm as IHaveTitle)?.Title.StartWith("") ?? 
            Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
    .Switch()
    .ObserveOn(RxApp.MainThreadScheduler)
    .BindTo(this, w => w.Title));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM