1

我正在寻找将锚点添加到控制器中返回的 url 的可能性:

public static Result open(String id) {
  // here I want to add acnhor like #foo to the produced url
  return redirect(routes.MyPage.show(id));
}

发现在 play 1 中使用addRef方法是可能的,但我在 play 2 中找不到任何替代方法。

当然我可以使用像这样的连接:

public static Result open(String id) {
  // here I want to add acnhor like #foo to the produced url
  return redirect(routes.MyPage.show(id).url + "#foo");
}

但它看起来很丑。

感谢您的任何帮助!祝你有美好的一天!

4

2 回答 2

3

在尝试回答这个问题之前。我应该建议您更改当前设置的任何行为。

因为,URL 片段的目的只是客户端。这样的片段永远不会发送到服务器,因此反之则很麻烦。

但是,这是您可以遵循的(相当?)优雅解决方案的雏形。

我将尝试做的是让浏览器处理片段,以保持潜在的行为(去 ID 甚至处理历史......)。

为此,您可以implicit向模板添加一个参数,该参数main将定义 URL 应具有的片段:

@(title: String)(content: Html)(urlFragment:Option[UrlFragment] = None)

如您所见,我将参数包装在 an 中Option并默认为None(为了避免 AMAP 污染)。

此外,它只是包装了 aString但您可以String单独使用——使用专用类型将强制执行语义。这是定义:

case class UrlFragment(hash:String)

非常简单。

现在这里是如何告诉浏览器处理它。head在元素的结尾和 的开头之前body,只需添加以下内容:

@urlFragment.map { f =>
  <script>
    $(function() {
      //after everything is ready, so that other mechanism will be able to use the change hash event...
      document.location.hash = "@Html(@f.hash)";
    });
  </script>
}

如您所见,使用map(即urlFragmentis not时None)我们添加了一个脚本块,该块将在urlFragment.

然而,这可能是一个开始……为整个场景考虑另一种解决方案。

于 2013-02-25T13:53:54.767 回答
3

从 Play 2.4 开始,可以使用Call.withFragment().

routes.Application.index.withFragment("some-id").absoluteURL(request)

这是PR #4152添加的。

于 2016-12-19T23:23:04.290 回答