2

我想要一个可以在任何地方使用的加载微调器。所以我创建了一个 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 输出,布尔值被正确且立即处理。

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

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

4

1 回答 1

1

一种解决方案是创建一个以 false 开头的 Observable,然后做一些工作并变为 true。IE

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()
  }
}
于 2017-07-01T13:18:42.847 回答