我目前正在开发一个GWT应用程序,但我对如何将其组合在一起仍有点模糊(在不首先了解整个框架的情况下进行更改的乐趣,尽管这可能很困难)。
我们有一些活动都对应于UI的各个部分(例如,主要内容、工具栏和事物列表)。我真的不确定这是否是活动的目的,但我想我现在真的无法轻易改变。我现在的问题是,事物列表保持了主要内容也需要的状态(当前选择),在某种程度上也保持了工具栏(至少当前的工具栏有它——我无法询问)。
但是,实际上是一个合适的存储位置吗?我想将实际的视图实现耦合在一起并只将所选内容存储在列表中并不是一个好主意。
我在这里看到了两个主要的解决方案:
-
在每个活动中保持状态,并通过事件(在
EventBus
上)保持它们的同步。即:"事物列表"有一个当前选择,主视图也有一个,工具栏也是如此;每次值发生变化时,进行更改的活动都会在事件总线上触发一个事件,以便其他活动可以更新其状态,从而使所有活动在其自身状态下都具有相同的值。 -
使用singleton对象(如果使用GIN和依赖项注入,只需用
@Singleton
注释该对象并将其注入所有活动中)即可将状态保持在中心位置。活动在状态持有者对象上注册事件处理程序,以便在其更改时得到通知。也就是说,每次活动调用setCurrentSelection
(例如)时,都会触发一个事件(例如ValueChangeEvent
),因为所有活动都在侦听它,所以它们可以根据新值更新视图或其他内容。您可以选择在事件总线上调度事件(类似于PlaceController
),或者让状态持有者实现HasValueChangeHandlers
。只需确保在活动stop
时注销处理程序,以避免内存泄漏(在事件总线上进行调度更容易:只需在作为参数传递给start
方法的总线上注册处理程序,当活动停止时,它们将自动注销,您甚至不必考虑它)。
实际上,PlaceController
就是这种共享状态(当前位置)的一个很好的例子。