ReactiveUI 7.0,ReactiveCommand,订阅永远不会触发?
ReactiveUI 7.0, ReactiveCommand, Subscribe never fires?
我正在努力研究最近从 6.5.2 更新到 7.0 的 reactiveUI,并且似乎包括一些关于 ReactiveCommand 的重大更改。
EG 这曾经有效:
在视图模型中:
public ReactiveCommand<Unit> DoLogin;
...
DoLogin = ReactiveCommand.CreateAsyncTask(
async x => {
IsBusy = true;
await Task.Delay(2500);
IsBusy = false;
return Unit.Default;
});
在视图中:
//bind the command
Observable.FromEventPattern(x => loginButton.Clicked += x, x => loginButton.Clicked -= x)
.Subscribe(args => ViewModel.DoLogin.Execute(null));
//do something after the dologin is complete
this.WhenAnyObservable(x => x.ViewModel.DoLogin)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe( x => {
DisplayAlert("login complete", "welcome", "OK");
}
);
但现在在 reactui 7.0 中,情况有所不同,我不得不进行一些更改,但我无法使其正常工作:
在视图模型中:
public ReactiveCommand<Unit, Unit> DoLogin;
...
DoLogin = ReactiveCommand.CreateFromTask(
async x => {
IsBusy = true;
await Task.Delay(2500);
IsBusy = false;
return Unit.Default;
});
在视图中:
//bind the command
Observable.FromEventPattern(x => loginButton.Clicked += x, x => loginButton.Clicked -= x)
.Subscribe(args => ViewModel.DoLogin.Execute());
//do something after the dologin is complete
this.WhenAnyObservable(x => x.ViewModel.DoLogin)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe( x => {
DisplayAlert("login complete", "welcome", "OK");
}
);
命令代码仍会执行,但 WhenANyObservable Subscribe 部分永远不会触发。它从不显示我的 DisplayAlert。
我正在使用 Xamarin Forms,如果这很重要,但即使在 Windows Forms 中我也会得到相同的行为。
问题是现在 Execute()
是一个冷可观察对象,所以不用调用
ViewModel.DoLogin.Execute()
你得打电话
ViewModel.DoLogin.Execute().Subscribe()
您可以在 release docs (ctrl+F "ReactiveCommand is Better")
中阅读更多关于 ReactiveCommand
的变化
顺便说一句 - 您可以通过在视图中使用绑定来代替 Observable.FromEventPattern
让您的生活更轻松。 docs about ReactiveCommand 中对此进行了描述。这样你就可以避免在另一个 Subscribe
调用中调用 Subscribe
,这是一种代码味道。代码应该类似于:
this.BindCommand(
this.ViewModel,
vm => vm.DoLogin,
v => v.loginButton);
另一个旁注 - ReactiveCommand
将 IsExecuting
公开为可观察的 属性,因此您可能不需要单独的标志 IsBusy
、
我正在努力研究最近从 6.5.2 更新到 7.0 的 reactiveUI,并且似乎包括一些关于 ReactiveCommand 的重大更改。
EG 这曾经有效:
在视图模型中:
public ReactiveCommand<Unit> DoLogin;
...
DoLogin = ReactiveCommand.CreateAsyncTask(
async x => {
IsBusy = true;
await Task.Delay(2500);
IsBusy = false;
return Unit.Default;
});
在视图中:
//bind the command
Observable.FromEventPattern(x => loginButton.Clicked += x, x => loginButton.Clicked -= x)
.Subscribe(args => ViewModel.DoLogin.Execute(null));
//do something after the dologin is complete
this.WhenAnyObservable(x => x.ViewModel.DoLogin)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe( x => {
DisplayAlert("login complete", "welcome", "OK");
}
);
但现在在 reactui 7.0 中,情况有所不同,我不得不进行一些更改,但我无法使其正常工作:
在视图模型中:
public ReactiveCommand<Unit, Unit> DoLogin;
...
DoLogin = ReactiveCommand.CreateFromTask(
async x => {
IsBusy = true;
await Task.Delay(2500);
IsBusy = false;
return Unit.Default;
});
在视图中:
//bind the command
Observable.FromEventPattern(x => loginButton.Clicked += x, x => loginButton.Clicked -= x)
.Subscribe(args => ViewModel.DoLogin.Execute());
//do something after the dologin is complete
this.WhenAnyObservable(x => x.ViewModel.DoLogin)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe( x => {
DisplayAlert("login complete", "welcome", "OK");
}
);
命令代码仍会执行,但 WhenANyObservable Subscribe 部分永远不会触发。它从不显示我的 DisplayAlert。
我正在使用 Xamarin Forms,如果这很重要,但即使在 Windows Forms 中我也会得到相同的行为。
问题是现在 Execute()
是一个冷可观察对象,所以不用调用
ViewModel.DoLogin.Execute()
你得打电话
ViewModel.DoLogin.Execute().Subscribe()
您可以在 release docs (ctrl+F "ReactiveCommand is Better")
中阅读更多关于ReactiveCommand
的变化
顺便说一句 - 您可以通过在视图中使用绑定来代替 Observable.FromEventPattern
让您的生活更轻松。 docs about ReactiveCommand 中对此进行了描述。这样你就可以避免在另一个 Subscribe
调用中调用 Subscribe
,这是一种代码味道。代码应该类似于:
this.BindCommand(
this.ViewModel,
vm => vm.DoLogin,
v => v.loginButton);
另一个旁注 - ReactiveCommand
将 IsExecuting
公开为可观察的 属性,因此您可能不需要单独的标志 IsBusy
、