【问题标题】:ReactiveUI 7.0, ReactiveCommand, Subscribe never fires?ReactiveUI 7.0、ReactiveCommand、Subscribe 永远不会触发?
【发布时间】:2016-11-24 03:22:42
【问题描述】:

我正试图围绕reactiveUI,它最近从6.5.2 更新到7.0,并且似乎包括一些关于ReactiveCommand 的重大更改。

EG 这曾经有效:

在 ViewModel 中:

 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 中,情况有所不同,我不得不进行一些更改,但我无法使其正常工作:

在 ViewModel 中:

  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 表单,如果这很重要,但即使在 Windows 表单中我也会得到相同的行为。

【问题讨论】:

    标签: xamarin.forms system.reactive reactiveui


    【解决方案1】:

    问题是现在Execute() 是一个冷的可观察对象,所以不要调用

    ViewModel.DoLogin.Execute()

    你必须打电话

    ViewModel.DoLogin.Execute().Subscribe()

    您可以在release docs 中阅读有关ReactiveCommand 更改的更多信息(ctrl+F "ReactiveCommand is Better")

    顺便说一句,您可以通过在视图中使用绑定来代替Observable.FromEventPattern,让您的生活更轻松。这在docs about ReactiveCommand 中有描述。这样,您将避免在另一个 Subscribe 调用中出现 Subscribe 调用,这是代码异味。代码应该是这样的:

    this.BindCommand(
        this.ViewModel,
        vm => vm.DoLogin,
        v => v.loginButton);
    

    另一个旁注 - ReactiveCommandIsExecuting 公开为可观察属性,因此您可能不需要单独的标志 IsBusy

    【讨论】:

    • 是的,太好了。我设法解决了这个问题。现在变得更干净了。尝试学习我不理解的东西时很难,同时语法也会发生变化!
    猜你喜欢
    • 2014-05-15
    • 2021-05-22
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多