简体   繁体   English

如何获取GWT中的最新历史令牌

[英]how to get the last history token in GWT

I want to get the previous token of my navigation. 我想获取导航的上一个标记。

For exemple, being in this page: 例如,在此页面中:

http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page1 http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page1

I am redirected somehow to this new page : 我以某种方式重定向到这个新页面:

http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page2 http://www.example.com/com.example.gwt.HistoryExample/HistoryExample.html#page2

Now if I want the current token, I can easily get it this way: 现在,如果我想要当前令牌,则可以通过以下方式轻松获得它:

String currentPlace = placeManager.getCurrentPlaceRequest().getNameToken(); 字符串currentPlace = placeManager.getCurrentPlaceRequest()。getNameToken();

currentPlace will receive "page2" but i can't figure how to get the previous token which is "page1" currentPlace将收到“ page2”,但我不知道如何获取先前的令牌“ page1”

I am not sure why your application issue of page1 redirecting to page2 but here goes. 我不确定为什么将您的应用程序问题从page1重定向到page2,但是问题就在这里。 I extends the place controller so that I can do a goBackOr(Place place). 我扩展了位置控制器,以便可以执行goBackOr(Place place)。 This will allow you to get the previous place. 这将使您获得以前的位置。 You can call getPreviousPlace(). 您可以调用getPreviousPlace()。 This might be a useful way to handle place navigation when you have an edit activity and you want to go back to the previous place where the user came from. 当您有编辑活动并且想返回用户来自的前一个位置时,这可能是处理位置导航的有用方法。 You should be able to replace with this place controller without changes atleast for testing purposes. 您应该能够使用该位置控制器进行替换,而无需进行至少出于测试目的的更改。

public class PlaceController extends com.google.gwt.place.shared.PlaceController {

    private static final Logger log = Logger.getLogger(PlaceController.class.getName());

    private final EventBus eventBus;

    private final Delegate delegate;

    private Place where = Place.NOWHERE;

    /**
     * Previous place from history.
     */
    private Place previousPlace = null;

    /**
     * Legacy method tied to the old location for {@link EventBus}.
     * 
     * @deprecated use {@link #PlaceController(EventBus)}
     */
    @Deprecated
    public PlaceController(com.google.gwt.event.shared.EventBus eventBus) {
        this((EventBus) eventBus);
    }

    /**
     * Legacy method tied to the old location for {@link EventBus}.
     * 
     * @deprecated use {@link #PlaceController(EventBus, Delegate)}
     */
    @Deprecated
    public PlaceController(com.google.gwt.event.shared.EventBus eventBus, Delegate delegate) {
        this((EventBus) eventBus, delegate);
    }

    /**
     * Create a new PlaceController with a {@link DefaultDelegate}. The
     * DefaultDelegate is created via a call to GWT.create(), so an alternative
     * default implementation can be provided through <replace-with> rules
     * in a {@code .gwt.xml} file.
     * 
     * @param eventBus
     *            the {@link EventBus}
     */
    public PlaceController(EventBus eventBus) {
        this(eventBus, (Delegate) GWT.create(DefaultDelegate.class));
    }

    /**
     * Create a new PlaceController.
     * 
     * @param eventBus
     *            the {@link EventBus}
     * @param delegate
     *            the {@link Delegate} in charge of Window-related events
     */
    public PlaceController(EventBus eventBus, Delegate delegate) {
        super(eventBus, delegate);
        this.eventBus = eventBus;
        this.delegate = delegate;
        delegate.addWindowClosingHandler(new ClosingHandler() {
            public void onWindowClosing(ClosingEvent event) {
                String warning = maybeGoTo(Place.NOWHERE);
                if (warning != null) {
                    event.setMessage(warning);
                }
            }
        });
    }

    /**
     * Get the previous place, if null then this is the first place.
     * 
     * @return a {@link Place} instance
     */
    public Place getPreviousPlace() {
        return previousPlace;
    }

    /**
     * Returns the current place.
     * 
     * @return a {@link Place} instance
     */
    public Place getWhere() {
        return where;
    }

    /**
     * Request a change to a new place. It is not a given that we'll actually
     * get there. First a {@link PlaceChangeRequestEvent} will be posted to the
     * event bus. If any receivers post a warning message to that event, it will
     * be presented to the user via {@link Delegate#confirm(String)} (which is
     * typically a call to {@link Window#confirm(String)}). If she cancels, the
     * current location will not change. Otherwise, the location changes and a
     * {@link PlaceChangeEvent} is posted announcing the new place.
     * 
     * @param newPlace
     *            a {@link Place} instance
     *            
     */
    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)) {
            previousPlace = where;
            where = newPlace;
            eventBus.fireEvent(new PlaceChangeEvent(newPlace));
        }
    }

    /**
     * This is useful for going back unless there is,
     * not a previous place, commonly when a user refreshes
     * the screen and then tries to click back.
     * @param place Place to go if there is not a previous place set.
     */
    public void goBackOr(Place place) {
        Place previousPlace = getPreviousPlace();

        if (previousPlace != null && previousPlace != Place.NOWHERE) {
            goTo(previousPlace);
        } else if (place != null) {
            goTo(place);
        } else {
            throw new RuntimeException("Previous place was null and the optional place was not specified");
        }

    }

    /**
     * Visible for testing.
     */
    private Logger log() {
        return log;
    }

    private String maybeGoTo(Place newPlace) {
        PlaceChangeRequestEvent willChange = new PlaceChangeRequestEvent(newPlace);
        eventBus.fireEvent(willChange);
        String warning = willChange.getWarning();
        return warning;
    }

}

You can add this code for example in your onModuleLoad() method or into a class that is created at the beginning of your application and of course not destroyed afterward 例如,您可以在onModuleLoad()方法中或在应用程序开始时创建的类中添加此代码,然后当然不将其销毁。

private Place previousPlace;
private Place currentPlace;

eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {

      public void onPlaceChange(PlaceChangeEvent event) {

          previousPlace = currentPlace;
          currentPlace = event.getNewPlace();
      }
  });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM