这里还有一些GWT菜鸟,但正如Google here所描述的那样使用活动和地点取得进展。
我知道Place的“URL”包含Place的简单类名(如“HelloPlace”),后跟冒号(:)和PlaceTokenizer返回的标记。
当我没有要发送的令牌时,我可以以某种方式删除冒号吗?
例如,当我需要使用PersonId = 2时,我可以使用像这样的“#editPerson:2”这样的URL。但是,当我只想提出一个空白的人形表时呢?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”
任何建议(甚至更好的代码建议)都会非常感激!
答案 0 :(得分:3)
要完全控制URL哈希(即从Places生成自己的令牌并将这些令牌映射回Places),您可以实现自己的历史映射器(实现PlaceHistoryMapper接口的类)。 / p>
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 :(得分:3)
您可以提供自己的PlaceHistoryMapper(不使用生成器),如Boris_siroB已经建议的那样,或者您可以在PlaceTokenizer中使用空前缀:使用空前缀,不会有冒号和标记生成器可以做任何你想做的事。如果你完全不同的地方,让它成为Place的标记化器,所以它也是getToken的“catchall”。通过这种方式,您可以使用前缀,PlaceTokenizers和WithTokenizers(如果您想利用它们)保留代的所有优势。
答案 2 :(得分:1)
我正在使用名为PlaceHistoryMapperWithoutColon的PlaceHistoryMapper装饰器。
用法:
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 "";
}
}
}