4

ここではまだ GWT 初心者ですが、Googleがここで説明しているように、Activities と Places を使用して進歩しています。

Place の「URL は、Place の単純なクラス名 (「HelloPlace」など) の後にコロン (:) と PlaceTokenizer によって返されるトークンで構成されることを理解しています。

送信するトークンがない場合、どうにかしてコロンを削除できますか?

たとえば、PersonId=2 で作業する必要がある場合は、この「#editPerson:2」のような URL で問題ありません。しかし、空の Person フォームを表示したいだけの場合はどうでしょうか。その場合、「#addPersonForm:」ではなく「#addPersonForm」を使用することをお勧めします。

任意の提案 (より良いコードの提案) をいただければ幸いです。

4

3 に答える 3

3

Boris_siroB によって既に提案されているように、(ジェネレーターを使用せずに) 独自の PlaceHistoryMapper を提供するか、空のプレフィックスを使用して PlaceTokenizer 内でそれを行うことができます。空のプレフィックスを使用すると、コロンがなくなり、トークナイザーは何でもできます。あなたがしたい。場所を完全に区別する場合は、場所のトークナイザーにします。これは、getToken の「キャッチオール」でもあります。そうすれば、プレフィックス、PlaceTokenizers、および WithTokenizers を使用して生成のすべての利点を維持できます (それらを利用したい場合)。

于 2011-12-10T01:00:52.863 に答える
3

URL ハッシュを完全に制御する (つまり、Places から独自のトークンを生成し、これらのトークンを Places にマッピングする) には、独自の履歴マッパー ( 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 ハッシュをクラス名ベースにする必要も、区切り文字 を使用する必要もなくなりました。

于 2011-12-09T17:16:05.407 に答える
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 "";
        }

    }
}
于 2013-12-30T10:31:54.703 に答える