不带冒号(:)的地名

  • 本文关键字: gwt gwt-places
  • 更新时间 :
  • 英文 :


这里仍然是一个GWT新手,但在使用Google在这里描述的活动和地点方面取得了进展。

我理解Place的"URL"由Place的简单类名(如"HelloPlace")后面跟着冒号(:)和PlaceTokenizer返回的标记组成。

当我没有令牌要发送时,我可以以某种方式删除冒号吗?

例如,当我需要使用PersonId=2时,我可以使用这样的URL"#editPerson:2"。但是,如果我只想显示一个空白的Person表单怎么办?在这种情况下,我宁愿使用"#addPersonForm"而不是"#addPersonForm:"

任何建议(甚至更好的代码建议)将是最感激的!

您可以像Boris_siroB建议的那样提供您自己的PlaceHistoryMapper(不使用生成器),或者您可以在带有空前缀的PlaceTokenizer中完成它:使用空前缀,将不会有冒号,并且标记器可以做任何您想做的事情。如果您完全区分不同的位置,则将其作为Place的标记器,因此它也是getToken的"总括"。这样,您就可以保留前缀、placetokenizer和withtokenizer生成的所有优点(如果您想利用它们)

要完全控制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哈希不再需要基于类名或使用:分隔符。

我使用一个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 "";
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新