10

我有一个名为 Orders 的页面和一个名为 OrderDetails 的页面。正如优秀的MVP 教程中所述,我正在使用 History(使用中央 ValueChangeListener)和“事件总线”HandlerManager。

我为某人单击订单的事件注册了一个处理程序,该处理程序基本上创建 OrderDetailPresenter,传入订单 ID(包含在 ShowOrderDetailEvent 中),然后调用History.newItem("orderDetails").

这有几个主要缺点:这个新创建的历史记录步骤不知道传入的是哪个订单 ID。因此,例如,如果有人将订单详细信息页面添加为书签(或在浏览器中返回然后前进),他们将得到一个空的没有订单详情的页面。

所以我的问题是:我应该改为执行类似的操作History.newItem("orderDetails?id="+id),然后在我的值更改侦听器中解析历史令牌吗?如果是这样,是否有以这种方式将参数解析和格式化为字符串的最佳实践、API 或库?

4

1 回答 1

9

是的,这就是你应该做的。据我所知,没有图书馆可以让这更容易。

不过,有一点建议:如果可能的话,您应该避免使用要求您在历史项目字符串中使用百分比转义的方案。原因是结束location.hash时返回的内容因浏览器而异。例如,Chrome 返回; 火狐返回. 设置可以具有类似的特定于浏览器的效果。location.href#%3C@%40#%3C@%40#<@@location.hash

GWT 的历史令牌机制依赖location.hash于浏览器行为中的这种差异,并且不会对其进行规范化。最终结果是,如果您使用需要百分比转义的东西,您将获得无法跨浏览器共享的 url - 如果在其他页面上您想要生成跳转到 GWT 中特定位置的链接,这将是一个问题应用程序,或者如果您希望用户共享链接到您的 GWT 应用程序中的 URL。(或者当您的用户安装 Chrome,从 Firefox 中导入指向您的 web 应用程序中特定位置的书签时,突然这些书签不像以前那样工作了)

对于偏执狂,我会避免在您的历史令牌字符串中放置任何?, #, &, %, <, 或>字符。但是,像这样的字符串orderDetails/oid=12313378应该没问题,并且可以跨浏览器。

(编辑澄清我正在谈论的问题是处理相同的 URL 在多个不同的浏览器中工作,而不是让历史令牌方法在每个不同的浏览器中都工作)

于 2010-02-25T13:58:41.223 回答