2017-06-28 23 views
2

我想有一个可以从任何地方使用的加载微调器。所以,我创建了一个BoolHandler:OutWatch:强制更改元素立即显示

val loadingSpinnerEvents = createBoolHandler() 

这势必会加载微调格:

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输出,布尔值正确处理并立即处理。

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

有没有办法强制这个或我错过了什么。

+0

你的两个绑定之间做什么样的工作?请注意,这不完全是“OutWatch”做事的方式。您正在为相同的事件创建两个绑定,这可能是一个误解。 '< - '操作符不会发送单个事件,但会为observable创建订阅。如果你只是发送一个单一的值,这并不合理。 –

+0

你说得对。但是,您将如何向用户展示正在进行的工作。因此,在开始计算时显示加载微调器 - 并在页面完全加载时隐藏它。 – pme

+0

您是否尝试过使用我的解决方案? :) –

回答

1

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

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

但是,这取决于正在完成的工作。如果它是同步的,这种方法应该工作得很好。

如果你的工作是异步的,需要一个回调,你也可以将它包装在可观察到的:

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

这两个解决方案都不适合我。我认为这个问题可能是我在商店的reducer方法中调用的,也就是Observable。 – pme

+0

你能告诉我你的减速机方法吗? –

+0

我调整了我的问题 – pme