Название места без двоеточия (:)? - PullRequest
4 голосов
/ 09 декабря 2011

Здесь все еще что-то вроде новичка GWT, но прогресс достигается с помощью действий и мест, как описано в Google здесь .

Я понимаю, что "URL места" состоит из простого имени класса места (например, "HelloPlace"), за которым следует двоеточие (:) и токен, возвращаемый PlaceTokenizer.

Можно ли как-нибудь удалить двоеточие, если у меня нет токена для отправки?

Например, я в порядке с URL-адресом, подобным этому «#editPerson: 2», когда мне нужно работать с PersonId = 2. Но как насчет того, когда я просто хочу представить пустую анкету? В этом случае я бы предпочел использовать "#addPersonForm", а не "#addPersonForm:"

Буду признателен за любые предложения (даже более качественные)!

Ответы [ 3 ]

3 голосов
/ 10 декабря 2011

Вы можете предоставить свой собственный PlaceHistoryMapper (без использования генератора), как уже предложено Boris_siroB, или вы можете сделать это в PlaceTokenizer с пустым префиксом: с пустым префиксом не будет двоеточия и токенизаторамогу делать все что захочешьЕсли вы полностью различаете места, сделайте это токенизатором Place, так что это также «ловушка» для getToken.Таким образом, вы можете сохранить все преимущества генерации с помощью префиксов, PlaceTokenizer и WithTokenizer (если вы хотите ими воспользоваться)

3 голосов
/ 09 декабря 2011

Чтобы получить полный контроль над хэшем URL (то есть генерировать свои собственные токены из Places и отображать эти токены обратно в Places), вы можете реализовать свой собственный механизм отображения истории (класс, реализующий интерфейс PlaceHistoryMapper ).

public class MyPlaceHistoryMapper implements PlaceHistoryMapper {

   @Override
   public Place getPlace(String token) {
        // parse tokens and create Places here  
   }

   @Override
   public String getToken(Place place) {
        // examine Places and compose tokens here
   }
}

В классе точки входа вы должны заменить строку:

AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);

на:

PlaceHistoryMapper appHistoryMapper = new MyPlaceHistoryMapper();

Вот и все.Ваши хэши URL больше не должны быть основаны на имени класса или использовать разделитель :.

1 голос
/ 30 декабря 2013

Я использую декоратор PlaceHistoryMapper с именем PlaceHistoryMapperWithoutColon.

Использование:

final PlaceHistoryMapper historyMapper0 = GWT
                .create(PlaceHistoryMapperImpl.class);

final PlaceHistoryMapper historyMapper = new PlaceHistoryMapperWithoutColon(historyMapper0);

Источник декоратора:

public class PlaceHistoryMapperWithoutColon implements PlaceHistoryMapper {

    private static final String COLON = ":";

    private PlaceHistoryMapper placeHistoryMapper;

    public PlaceHistoryMapperWithoutColon(PlaceHistoryMapper placeHistoryMapper) {
        this.placeHistoryMapper = placeHistoryMapper;
    }

    @Override
    public Place getPlace(String token) {
        if (token != null && !token.endsWith(COLON)) {
            token = token.concat(COLON);
        }
        return placeHistoryMapper.getPlace(token);
    }

    @Override
    public String getToken(Place place) {
        String token = placeHistoryMapper.getToken(place);
        if (token != null && token.endsWith(COLON)) {
            token = token.substring(0, token.length() - 1);
        }
        return token;
    }

}

Пример оформления источника:

@WithTokenizers({ FirstPlace.Tokenizer.class, SecondPlace.Tokenizer.class })
public interface PlaceHistoryMapperImpl extends PlaceHistoryMapper {

}

Пример места размещения:

public final class FirstPlace extends Place {

    @Prefix("first")
    public static class Tokenizer implements PlaceTokenizer<FirstPlace> {

        @Override
        public NetworkInfosPlace getPlace(String token) {
            return new FirstPlace ();
        }

        @Override
        public String getToken(FirstPlace place) {
            return "";
        }

    }
}
...