2011-12-09 55 views
3

仍然有点GWT noob在这里,但使用谷歌here描述的活动和地点取得进展。不带冒号(:)的地名?

我明白,一个地方的“URL由地方的简单类名(如‘HelloPlace’),后跟一个冒号(:)和由PlaceTokenizer返回的令牌。

我可以以某种方式去除结肠癌当我没有令牌发送?

例如,我很喜欢这个URL“#editPerson:2”,当我需要使用PersonId = 2。但是当我只是想要呈现一个空白的人形式?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”

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

+0

这是来自doc:'你的应用中的许多地方可能不会保存任何状态到URL,所以他们可以扩展一个BasicPlace,它声明一个返回null标记的PlaceTokenizer'你是否尝试创建PlaceTokenizer,你的添加人形式的空令牌? – Strelok

+0

感谢您的回复。如果我从getToken(PlaceName地方)返回null,那么我最终会得到如下的URL:“#addPersonForm:null”。我错过了什么(可能:)? – Justin

回答

2

您可以像Boris_siroB建议的那样提供您自己的PlaceHistoryMapper(不使用生成器),或者您可以在PlaceTokenizer中使用空前缀来执行它:使用空前缀,不会有冒号,并且标记器可以做你想做的任何事情。如果你完全不同的地方,使它成为地方的标记器,所以它也是getToken的“catchall”。这样,您可以保留前辈,PlaceTokenizers和WithTokenizers的一切优点(如果你想利用它们)

+0

感谢您的回复。当你说“空前缀”时,你的意思是@Prefix(“”)?在这种情况下,我不只是得到一个带#标签的网址,没有别的?它不可收藏?可能我很困惑 – Justin

+0

我的意思是'@Prefix(“”)'。用空的前缀,历史记号直接是'PlaceTokenizer#getToken'返回的值。 –

+0

我现在得到你。当我为一个地方使用一个空的前缀并且仍然发送一个历史令牌时,它工作正常。然而,当我在第二个地方尝试它时,我也不需要URL中的任何状态,我得到一个发现重复的地方前缀“”错误。党! – Justin

2

要完全控制URL散列(即从位置生成自己的令牌并将这些令牌映射回位置),您可以实现自己的历史映射器(实现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散列不再需要基于类名称或使用:分隔符。

+0

非常感谢您的回复。如果我按照您的描述实现自己的历史映射器,这是否意味着我将不再需要AppPlaceHistoryMapper接口?和@WithTokenizers注释?和每个地方的Tokenizer?再次感谢! – Justin

+0

正确。在这个解决方案中,您不使用扩展PlaceHistoryMapper的注释接口(它需要使用GWT.create()来生成实际的PlaceHistoryMapper实例)。相反,你正在替代你自己的实现。如果您打算在实施中使用它们,您仍然可以为每个Place添加一个Tokenizer。我一直没有做到这一点。 –

+0

Boris_siroB,感谢这个信息。我最终与Thomas Broyer的建议一起去了,但我会为未来保留你的解决方案。 – Justin

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 ""; 
     } 

    } 
} 
+0

谢谢,我用这个。但我需要删除添加冒号的逻辑,以使带有令牌的地方能够再次运行。这种方法是否需要? – jan

+0

@jan抱歉,我不明白你的问题。如果你不需要我的装饰器,你应该只使用“最终的PlaceHistoryMapper historyMapper = GWT.create(PlaceHistoryMapperImpl.class);” –