2016-11-24 1 views
2

Я пытаюсь обернуть свою голову вокруг реактивного UI, который недавно обновился до 7.0 из 6.5.2 и, похоже, включает некоторые нарушения в отношении ReactiveCommand.ReactiveUI 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"); 
     } 
    ); 

но теперь в reactiveui 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 Forms, если это имеет значение, но даже в Windows Forms я получаю такое же поведение.

ответ

6

Проблема заключается в том, что теперь Execute() холодный различимы, вместо вызова

ViewModel.DoLogin.Execute()

вы должны вызвать

ViewModel.DoLogin.Execute().Subscribe()

Вы можете узнать больше об изменениях в ReactiveCommand в release docs (ctrl + F «ReactiveCommand лучше»)

Кстати, вы, вероятно, можете сделать свою жизнь проще, используя привязки на вашем месте вместо Observable.FromEventPattern. Это описано в docs about ReactiveCommand. Таким образом, вы избежите вызова Subscribe внутри другого вызова Subscribe, который является запахом кода. Код должен быть похож на это:

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

Другой Sidenote - ReactiveCommand выставляет IsExecuting как Наблюдаемое свойство, так что вы, вероятно, не нужен отдельный флаг IsBusy,

+1

да, здорово. мне удалось пробиться через это. теперь стало намного чище. его трудно, пытаясь узнать то, что я не понимаю, и в то же время синтаксис меняется! – 101chris

Смежные вопросы