Gwt 没有冒号(:)的地名?
在这里仍然有点像GWT noob,但在使用谷歌描述的活动和地点方面取得了进展 我知道Place的“URL”由Place的简单类名(如“HelloPlace”)后跟冒号(:)和PlaceTokenizer返回的标记组成 当我没有令牌发送时,是否可以删除冒号? 例如,当我需要使用PersonId=2时,我可以使用这样的URL“#editPerson:2”。但是当我只想显示一个空白的Person表单时呢?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”Gwt 没有冒号(:)的地名?,gwt,gwt-places,Gwt,Gwt Places,在这里仍然有点像GWT noob,但在使用谷歌描述的活动和地点方面取得了进展 我知道Place的“URL”由Place的简单类名(如“HelloPlace”)后跟冒号(:)和PlaceTokenizer返回的标记组成 当我没有令牌发送时,是否可以删除冒号? 例如,当我需要使用PersonId=2时,我可以使用这样的URL“#editPerson:2”。但是当我只想显示一个空白的Person表单时呢?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”
任何建议(甚至更好的代码建议)都将不胜感激!要完全控制URL哈希(即从位置生成您自己的标记并将这些标记映射回位置),您可以实现您自己的历史映射器(实现接口的类) 在入口点类中,您将替换以下行:
AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);
与:
就是这样。您的URL哈希不再需要基于类名或使用
:
分隔符。您可以提供自己的PlaceHistoryMapper(无需使用生成器)正如Boris_siroB所建议的,或者你可以在一个带有空前缀的PlaceTokenizer中实现:有了空前缀,就不会有冒号,而且标记器可以做任何你想做的事情。如果你完全不同的地方,就让它成为PlaceTokenizer,所以它也是“catchall”“谢谢你。这样,您就可以保留使用前缀、placeTokenizer和withTokenizer生成的所有优点(如果您想利用它们)我正在使用一个名为PlaceHistoryMapper的无冒号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 "";
}
}
}
放置源示例:
@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 "";
}
}
}
public final class FirstPlace扩展位置{
@前缀(“第一”)
公共静态类标记器实现PlaceTokenizer{
@凌驾
公共网络信息空间getPlace(字符串标记){
返回新的第一名();
}
@凌驾
公共字符串getToken(第一名){
返回“”;
}
}
}
这是来自文档:应用程序中的许多地方可能不会将任何状态保存到URL,因此它们可以扩展一个基本空间,该空间声明一个PlaceTokenizer,返回一个空令牌
您是否尝试创建PlaceTokenizer,为您的Add Person表单重新运行一个空令牌?谢谢您的回复。如果我从getToken(PlaceName-place)返回null,那么我最终会得到一个如下URL:“#addPersonForm:null”。我是否遗漏了什么(可能:)?非常感谢您的回复。如果我实现了您描述的自己的历史映射器,这是否意味着我将不再需要AppPlaceHistoryMapper接口?还有@WithTokenizers注释?每个地方都有一个标记器?再次感谢!对的在此解决方案中,您没有使用扩展PlaceHistoryMapper的带注释接口(这需要使用GWT.create()来生成实际的PlaceHistoryMapper实例)。相反,您正在替换自己的实现。如果您自己打算在实现中使用标记器,那么每个地方仍然可以有一个标记器。到目前为止,我一直没有这样做。Boris_siroB,谢谢你提供的信息。最后我同意了托马斯·布罗耶的建议,但我会记住你的解决方案。谢谢你的回复。当你说“空前缀”时,你是指@prefix(“”)?在这种情况下,我不是只得到一个带有标签的url吗?它不可书签?很可能我不明白我的意思是@前缀(“”)
。如果前缀为空,则历史标记直接是PlaceTokenizer\getToken
返回的值。当我为一个地方使用一个空前缀,并且仍然向它发送一个历史标记时,这就可以了。然而,当我在第二个位置尝试它时,我也不需要URL中的任何状态,我得到了一个“查找重复位置前缀”错误。该死!是的,对于给定前缀,只能有一个PlaceTokenizer
。正如我所说,对于一个类,您必须使用catchallPlaceTokenizer
,该类是您想要管理的所有位置的父类,而不带前缀:
(父类可以是位置
类本身)。当然,如果您永远不想要前缀:token
符号,那么您应该使用手工制作的PlaceHistoryMapper
。谢谢,我使用了这个。但我需要删除添加冒号的逻辑,以使带有标记的位置再次工作。这个方法随时都需要吗?@jan对不起,我不明白你的问题。如果不需要我的decorator,只需使用“final PlaceHistoryMapper historyMapper=GWT.create(PlaceHistoryMapperImpl.class);”