OutWatch:对要立即显示的Elements强制执行更改

时间:2017-06-28 12:02:26

标签: scala.js outwatch

我想要一个可以在任何地方使用的加载微调器。所以我创建了一个BoolHandler:

val loadingSpinnerEvents = createBoolHandler()

哪个绑定到加载微调器div:

val loadingSpinner = div(
  hidden <-- loadingSpinnerEvents
  , Icon.loadingIcon
)

所以我做了以下事情:

def reducer(previousState: State, action: Action): State = {
  var st = previousState
  loadingSpinnerEvents <-- Observable.create { obs =>
    obs.next(false)
    st = newState(previousState, action)
    Future {
    // do the long running work

    }.onComplete { _ =>
      obs.next(true)
      obs.complete()
    }
  }
  st
}

根据println输出,布尔值正确且立即处理。

问题是只有在整个工作完成后才会显示元素更改。

有没有办法强制执行,或者我错过了什么。

1 个答案:

答案 0 :(得分:1)

一种解决方案是创建一个以false开头的Observable,然后执行一些工作并转为true。即。

val loadingSpinnerEvents = Observable.create{ obs =>
  obs.next(false)
  //do some work here
  obs.next(true)
}

然而,这取决于正在进行的工作。如果它是同步的,这种方法应该可以很好地工作。

如果您的工作是异步的并且需要回调,您也可以将其包装在Observable中:

val loadingSpinnerEvents = Observable.create{ obs => 
  obs.next(false)
  // do work with callback
  doWork {
    obs.next(true)
    obs.complete()
  }
}