2017-03-07 95 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