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));
}

方法1 を使用して可能であることがわかりましaddRefたが、方法 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に移動するか、履歴を処理することさえできます...)。

これを行うには、URL に含める必要があるフラグメントを定義するimplicitパラメーターをテンプレートに追加できます。main

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

ご覧のとおり、パラメーターを でラップし、Optionデフォルトに設定しましたNone(AMAP 汚染を避けるため)。

また、単純に a をラップしStringますが、単独で使用することもできます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(つまり が でurlFragmentはない場合None)、 で利用可能なハッシュを設定するスクリプト ブロックを追加しますurlFragment

しかし、これは始まりかもしれません... シナリオ全体に対する別の解決策を考えてください。

于 2013-02-25T13:53:54.767 に答える