2017-03-07 118 views
7

我想构建一个可以根据变量的值输出一个值的Observable。RxSwift基于变量构建一个Observable

类似的东西:

let fullName = Variable<String>("") 
let isFullNameOKObs: Observable<Bool> 

isFullNameOKObs = fullName 
      .asObservable() 
      .map { (val) -> Bool in 
       // here business code to determine if the fullName is 'OK' 
       let ok = val.characters.count >= 3 
       return ok 
      } 

不幸的是在地图FUNC欧元区不会被调用!

这背后的原因是:

  1. 的全名变量被绑定到一个的UITextField与双向操作者< - >如在RxSwift例子限定。
  2. isFullNameOKObs Observable将被观察到隐藏或显示我的ViewController的提交按钮。

任何帮助将不胜感激。

感谢

模型

class Model { 

    let fullName = Variable<String>("") 
    let isFullNameOKObs: Observable<Bool> 

    let disposeBag = DisposeBag() 

    init(){ 

     isFullNameOKObs = fullName 
      .asObservable() 
      .debug("isFullNameOKObs") 
      .map { (val) -> Bool in 
       let ok = val.characters.count >= 3 
       return ok 
      } 
      .debug("isFullNameOKObs") 


     isRegFormOKObs = Observable.combineLatest(
      isFullNameOKObs, 
      is...OK, 
      ...) { $0 && $1 && ... } 


     isRegFormOKObs 
      .debug("isRegFormOKObs") 
      .asObservable() 
      .subscribe { (event) in 
       // update the OK button 
      } 
      // removing this disposedBy resolved the problem 
      //.disposed(by: DisposeBag()) 

    } 
} 

的视图控制器:

func bindModel() -> Void { 

    _ = txFullName.rx.textInput <-> model!.fullName 
    ...... 

} 
+0

解决,但我不明白如何。 我对表单的每个TextField使用相同的模式:名为isMyTextFieldOK的Observable计算一些业务规则。最后一个观察结果是组合最大的所有isMyTextFieldOK观察值。我确实在这最后一个可观察对象上附加了一个处置(通过:disposeBag)调用。删除它解决了一切。但我不知道为什么。 :-( – t4ncr3d3

回答

4

你需要双向的UITextField和你Variable之间的绑定?

如果没有,我会建议你尽量只使用bindTo(),而不是像这样: myTextField.rx.text.orEmpty.bindTo(fullName).disposed(by: disposeBag)

+0

不会改变,变量是由UITextField正确更新的,但Observable的值仍然不能反映正确的情况 – t4ncr3d3

+0

如何将'isFullNameOKObs'绑定到你的按钮?请分享你的代码,重新使用 – BStien

+0

仍然没有确定如何去做 – t4ncr3d3