Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 没有冒号(:)的地名?_Gwt_Gwt Places - Fatal编程技术网

Gwt 没有冒号(:)的地名?

Gwt 没有冒号(:)的地名?,gwt,gwt-places,Gwt,Gwt Places,在这里仍然有点像GWT noob,但在使用谷歌描述的活动和地点方面取得了进展 我知道Place的“URL”由Place的简单类名(如“HelloPlace”)后跟冒号(:)和PlaceTokenizer返回的标记组成 当我没有令牌发送时,是否可以删除冒号? 例如,当我需要使用PersonId=2时,我可以使用这样的URL“#editPerson:2”。但是当我只想显示一个空白的Person表单时呢?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”

在这里仍然有点像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
。正如我所说,对于一个类,您必须使用catchall
PlaceTokenizer
,该类是您想要管理的所有位置的父类,而不带
前缀:
(父类可以是
位置
类本身)。当然,如果您永远不想要
前缀:token
符号,那么您应该使用手工制作的
PlaceHistoryMapper
。谢谢,我使用了这个。但我需要删除添加冒号的逻辑,以使带有标记的位置再次工作。这个方法随时都需要吗?@jan对不起,我不明白你的问题。如果不需要我的decorator,只需使用“final PlaceHistoryMapper historyMapper=GWT.create(PlaceHistoryMapperImpl.class);”