1

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

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

我现在正在这样做:

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

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

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

感谢!

4

2 回答 2

4

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

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中。

于 2013-07-01T07:54:35.043 回答
1

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

据我了解,浏览器不支持修改浏览器 URL 而不在历史记录中插入令牌。GWTP 0.4 不会触及 URL(而 0.3 触及它,迫使您在历史记录中插入一个新元素)。调用 updateHistory() 应该与 0.3 具有完全相同的效果。

我记得有些人说他们能够修改 URL,而无需插入历史令牌,也无需通过使用带有修改后的哈希片段的当前 url 调用 Window.Location.replace() 来重新加载应用程序。但是,这没有记录在案,如果它适用于所有浏览器,我会感到惊讶。

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

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

在 GWTP 中,当你使用 eClipse 创建演示者时说 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

希望这可以帮助你

于 2013-07-04T08:55:16.003 回答