2011-12-09 4 views
3

Google here에 설명 된 바와 같이 활동 및 장소를 사용하여 아직 GWT 멍청한 놈입니다.장소 이름은 콜론 (:)이 없습니까?

나는 장소의 콜론 (:)과 PlaceTokenizer에 의해 반환 된 토큰 뒤에 "(HelloPlace"URL이 같은) 장소의 간단한 클래스 이름으로 구성 "을 이해합니다.

은 어떻게 든 결장을 제거 할 수

예를 들어 PersonId = 2로 작업해야 할 때 "#editPerson : 2"와 같은 URL을 사용해도 괜찮습니다. 빈 Person 폼을 표시하고 싶다면 "#addPersonForm :"대신 "#addPersonForm"을 사용하는 것이 좋습니다.

모든 제안 (더 나은 코드 제안)이 가장 높이 평가 될 것입니다!

+0

이것은 doc에서 온 것입니다 :'앱의 많은 장소가 URL에 어떤 상태도 저장할 수 없으므로 null 토큰을 반환하는 PlaceTokenizer를 선언하는 BasicPlace를 확장 할 수 있습니다 .' 당신이 다시 돌려주는 PlaceTokenizer를 만들려고 했습니까? Add Person 양식에 대한 널 토큰? 답장을 보내 주셔서 감사합니다. – Strelok

+0

getToken (PlaceName place)에서 null을 반환하면 "#addPersonForm : null"과 같은 URL로 끝납니다. 내가 뭔가를 놓친 건가? – Justin

답변

2

Boris_siroB에서 이미 제안한대로 제네레이터를 사용하지 않고 직접 PlaceHistoryMapper를 제공하거나 빈 접두어로 PlaceTokenizer에서 수행 할 수 있습니다. 빈 접두어로 콜론이없고 tokenizer 당신이 원하는대로 할 수 있습니다. 완전히 별개의 장소 인 경우 Place 토큰 화 도구로 지정하십시오. 따라서 getToken의 "catchall"이기도합니다. 그렇게하면 접두사, PlaceTokenizers 및 WithTokenizers (사용하려는 경우)를 사용하여 세대의 모든 장점을 유지할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. "빈 접두사"라고 할 때 @Prefix ("")를 의미합니까? 그 경우에는 해시 태그가있는 URL을 # 얻지 않고 그냥 아무것도하지 않습니까? 북마크 할 수 없습니까? 아마도 나는 혼란 스럽다. – Justin

+0

나는'@Prefix ("")'를 의미한다. 비어있는 접두어를 사용하면 히스토리 토큰은 바로'PlaceTokenizer # getToken'에 의해 반환 된 값이됩니다. –

+0

나는 당신을 지금 얻는다. 한 자리에 빈 접두사를 사용하고 여전히 기록 토큰을 보낼 때 제대로 작동합니다. 그러나, 내가 URL에서 어떤 상태도 필요로하지 않는 두 번째 장소에서 시도했을 때 중복 된 장소 접두사를 찾을 수 있습니다. " 댕! – Justin

2

URL 해시를 완벽하게 제어하려면 (장소에서 자신의 토큰을 생성하고이 토큰을 다시 지역 정보로 매핑) 자신의 기록 매퍼 (PlaceHistoryMapper 인터페이스를 구현하는 클래스)를 구현할 수 있습니다. 그것 뿐이다

PlaceHistoryMapper appHistoryMapper = new MyPlaceHistoryMapper(); 

:와

AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class); 

: 당신의 진입 점 클래스에서

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

당신은 행을 대체 할 것입니다. URL 해시가 더 이상 클래스 이름 기반이거나 : 구분 기호를 사용할 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다.내가 말한대로 내 자신의 히스토리 맵퍼를 구현한다면, 더 이상 AppPlaceHistoryMapper 인터페이스가 전혀 필요 없다는 뜻입니까? @WithTokenizers 주석과? 및 각 장소에 대한 Tokenizer? 다시 한 번 감사드립니다! – Justin

+0

수정. 이 솔루션에서는 PlaceHistoryMapper (실제 PlaceHistoryMapper 인스턴스를 생성하려면 GWT.create()를 사용해야 함)를 확장하는 주석이 달린 인터페이스를 사용하지 않습니다. 대신 자신의 구현을 대신 사용합니다. 구현시 자신을 사용하려는 경우 각 장소에 대해 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);"를 사용해야합니다. –

관련 문제