diff --git a/src/ReactiveUI.Blazor/ReactiveComponentBase.cs b/src/ReactiveUI.Blazor/ReactiveComponentBase.cs index 36fe286257..e0704ddd8c 100644 --- a/src/ReactiveUI.Blazor/ReactiveComponentBase.cs +++ b/src/ReactiveUI.Blazor/ReactiveComponentBase.cs @@ -8,6 +8,7 @@ using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Reactive; +using System.Reactive.Disposables; using System.Reactive.Linq; using System.Reactive.Subjects; using System.Runtime.CompilerServices; @@ -79,30 +80,37 @@ protected override void OnInitialized() base.OnInitialized(); } - /// - protected override void OnAfterRender(bool isFirstRender) + /// + protected override void OnAfterRender(bool firstRender) { - if (isFirstRender) + if (firstRender) { - this.WhenAnyValue(x => x.ViewModel) - .Skip(1) - .Where(x => x != null) + // The following subscriptions are here because if they are done in OnInitialized, they conflict with certain JavaScript frameworks. + var viewModelChanged = + this.WhenAnyValue(x => x.ViewModel) + .Where(x => x != null) + .Publish() + .RefCount(); + + viewModelChanged + .Subscribe(_ => InvokeAsync(StateHasChanged)); + + viewModelChanged + .Select(x => + Observable + .FromEvent( + eventHandler => + { + void Handler(object sender, PropertyChangedEventArgs e) => eventHandler(Unit.Default); + return Handler; + }, + eh => x.PropertyChanged += eh, + eh => x.PropertyChanged -= eh)) + .Switch() .Subscribe(_ => InvokeAsync(StateHasChanged)); } - this.WhenAnyValue(x => x.ViewModel) - .Where(x => x != null) - .Select(x => Observable.FromEvent( - eventHandler => - { - void Handler(object sender, PropertyChangedEventArgs e) => eventHandler(Unit.Default); - return Handler; - }, - eh => x.PropertyChanged += eh, - eh => x.PropertyChanged -= eh)) - .Switch() - .Do(_ => InvokeAsync(StateHasChanged)) - .Subscribe(); + base.OnAfterRender(firstRender); } /// @@ -125,7 +133,6 @@ protected virtual void Dispose(bool disposing) if (disposing) { _initSubject?.Dispose(); - _deactivateSubject.OnNext(Unit.Default); }