如何更改GWT中Place的更改时的URL?

时间:2017-02-08 15:37:03

标签: gwt

我有一个包含大量数据的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. 用户导航离开当前的地方
  2. 用户更改当前页面上的一些参数(这就是我想要做的)
  3. 如果用户导航离开当前位置(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));
    }
    

0 个答案:

没有答案