2011-12-09 105 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);」 –