我有一个包含大量数据的CellTable。在表格上方,用户可以添加不同类型的过滤器,从而限制显示的数据量。
每次更改其中一个过滤器时,它都会反映在Place中。 我开发了一个BasePlace,用于处理从该位置添加和删除子元素。这会产生以下URL(由Tokenizer.getToken()提供):
mysite.com/#ShowCellTable:Filter1=a,b,c&Filter2=123
在这种情况下,使用两个过滤器,Filter1配置数据'a,b,c',Filter2配置数据'123'
过滤器使用给定的过滤器和过滤器配置值修改场所。
这很有效。我可以在浏览器中输入网址,我的应用程序会显示正确配置的正确过滤器。但是,通过在CellTable上方输入过滤器值来配置过滤器时,值会正确写入场所,但场所不会反映在URL中。 但是,如果我离开CellTable页面,再次导航回来(placeController.goTo(cellTablePlace)) - URL将正确显示存储在Place中的值。
当直接在页面上修改过滤器时,我该怎么做才能让存储在Place中的令牌(并由Tokenizer.getToken()获取)反映在URL中?
感谢名单
更新(2017.02.13):
我仍然没有找到解决问题的方法......
更改应用的地点可能是由于两个不同的原因:
如果用户导航离开当前位置(1),则通过在PlaceController上调用goTo以编程方式完成:
placeController.goTo(new MyPlace(token));
...其中,token表示新地点的参数。
如果我想更改当前页面的过滤器参数(2),那么我首先想到的是在PlaceController上使用新的过滤器参数调用goTo。但是,这不起作用,因为PlaceController中的if语句检查新位置是否与旧位置相同:
public void goTo(Place newPlace) {
log().fine("goTo: " + newPlace);
if (getWhere().equals(newPlace)) {
log().fine("Asked to return to the same place: " + newPlace);
return;
}
String warning = maybeGoTo(newPlace);
if (warning == null || delegate.confirm(warning)) {
where = newPlace;
eventBus.fireEvent(new PlaceChangeEvent(newPlace));
}
}
但是,如果我直接调用eventBus,则没有任何反应。我发现,这是因为在代码的这一点上,没有附加的事件处理程序,可以处理代码......
任何帮助?
更新(2017.02.20):
我现在已经找到了自己问题的答案。
首先,我在代码中发现了一个错误:我已经实例化了ClientFactory的两个实例,导致了两个EventBus实例。在EventBus上发送事件的原因是什么,为什么没有发生。
但是,在EventBus上触发事件现在导致3个AttachDetachException。
我通过推迟调用EventBus来解决这个问题:
void filterChanged() {
Scheduler.get().scheduleDeferred(this::deferredRefreshPlace);
}
private void deferredRefreshPlace() {
clientFactory.getEventBus().fireEvent(new PlaceChangeEvent(place));
}