这里仍然是一个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 "";
}
}
}