【问题标题】:Append Parameters to my current URL in GWT在 GWT 中将参数附加到我当前的 URL
【发布时间】:2013-06-30 02:20:02
【问题描述】:

我正在我的应用程序上实现一个 jQuery 小部件。我希望在加载时启动小部件,为此我必须使用一个参数调用我的 url。

所以,它会像这样 MYURL/?param=value

我现在正在这样做:

Window.Location.replace(GWT.getHostPageBaseURL()+"?param=value");

并且工作正常,问题是重新加载应用程序。

有没有办法在不刷新我的网页的情况下做到这一点?

谢谢!

【问题讨论】:

    标签: url gwt


    【解决方案1】:

    为了不重新加载页面,您必须只修改哈希片段而不是查询字符串。

    Window.Location.replace(
       Window.Location.getPath() + Window.Location.getQueryString() +"#whatever");
    

    不过,在大多数浏览器中,有一种称为 pushState 的新机制,因此您可以将 url 更改为任何值而无需重新加载页面。 GWT 还没有任何包装器,但是您可以通过 JSNI 使用它,或者,如果您希望将 gwtquery 添加到您的项目中,请使用以下代码:

    import static com.google.gwt.query.client.GQuery.*;
    
    Properties history = JsUtils.prop(window, "history");
    JsUtils.runJavascriptFunction(history, 
              "pushState", null, null, "whatever.html?foo=true");
    

    仅供参考,新的gwtproject 网站在导航菜单时正在使用此机制和 gwtquery。源代码在gwt git

    【讨论】:

    • 我尝试使用 Window.Location.replace(Window.Location.getPath() +"?walkme=11111");但不起作用。我做的好吗?
    • 您不能将位置替换为更改查询字符串但更改哈希片段的值。将“?walkme=111”更改为“#walkme=111”。除非您使用 pushstate,否则更改查询字符串会使浏览器重新加载页面。
    • 我应该在窗口中放什么?
    • window 是静态变量GQuery.window。更新了答案以包含您必须使用的导入。
    • 好的,它附加了值,但没有执行操作。为什么会这样?
    【解决方案2】:

    正如 Philippe Beaudoin(我认为他为 Google 工作)所说,使用 Window.location 不是正确的方法:

    据我了解,修改浏览器 URL 而不插入 浏览器不支持历史记录中的令牌。 GWTP 0.4 不会 触摸 URL(而 0.3 触摸它,迫使您插入一个新的 历史上的元素)。调用 updateHistory() 应该有确切的 效果和0.3一样。

    我记得有些人说他们可以修改网址 无需插入历史令牌,也无需重新加载应用程序 使用当前 url 调用 Window.Location.replace() 修改后的哈希片段。但是,这没有记录在案,我会 如果它可以在所有浏览器上运行,您会感到惊讶。

    来源:https://groups.google.com/forum/#!topic/gwt-platform/glnowOS_8CM

    在 GWTP 中,您可以非常轻松地做到这一点。

    在GWTP中,当你使用eClipse创建Presenter说FirstPresenter时,eClipse会为你生成所有需要的类,这些类是:FirstPresenter.java, FirstView.java, FirstView.ui.xml

    Gwtp 中有一些包 (urproject.client.place) 可以帮助管理 Place 的所有内容,例如参数访问,添加 mor 参数而不刷新页面。

    在 FirstPresenter.java 中,你首先需要注入 PlaceManager(把它放在方法之外)然后创建一个函数说 addParam(String myParam):

        @Inject PlaceManager placeManager;
    
        public void addParam(String myParam, String myValue){
           PlaceRequest request = new PlaceRequest(NameTokens.yourNameToken).with(myParam, myValue);
          placeManager.updateHistory(request, true);
        }
    

    注意:如果您想要>1 个参数,您可以使用任意数量的.with 任意数量的.with(myParam, myValue).with(myParam2, myValue2)。您可以通过String val=request.getParameter(myParam,""); 获取参数。如果您想在页面初始化时获取参数,请使用:

        @Override
         public void prepareFromRequest(PlaceRequest request){
        super.prepareFromRequest(request);
        String myVal=request.getParameter("myParam", "");
         }
    

    就这样搞定了。您必须使用 Gwtp 包才能使用该功能,Gwtp 是我能推荐的最好的框架,它们有很多强大的东西。您不能仅使用 Gwt 来管理非常复杂的 Web 应用程序,因为 Gwt 太有限且仅适用于小型应用程序,但大型 Web 应用程序需要强大的框架,即 Gwtp。 Stackoverflow 中没有多少人知道 Gwtp,所以很难得到答案,但你可以通过观看视频来学习。

    这里有一个非常好的视频供你在 youtube 上学习 GWTP:

    http://www.youtube.com/watch?v=Gm-RO-cmsEQ&list=PL29DDDC847F63AF82

    希望对你有帮助

    【讨论】:

    • 请,这将是确切的代码。在 NameToken 中放什么?地方经理?我在该行中遇到错误,缺少明显的东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2020-09-24
    • 1970-01-01
    • 2015-02-21
    • 2012-01-23
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多