Grails render() с параметром фрагмента
Есть ли способ использовать render() с параметром фрагмента, чтобы при загрузке страницы он автоматически прокручивался до определенной части страницы? Аналогично тому, как мы можем позвонить
redirect(controller: "book", action: "show", fragment: "profile")
2 ответа
Вы не можете передать это render()
потому что к тому времени вы на самом деле вызываете render()
URL уже был определен и сопоставлен с вашими действиями; все, что делает render - это контролирует то, что записывается обратно в ответ.
Фрагмент должен быть уже в URL, прежде чем будет вызвано действие контроллера рендеринга. Вот пример:
grails-app/controllers/MyController.groovy
class MyController {
def foo = {
render(view: 'foo')
}
def quux = {
redirect(action: 'foo', fragment: 'baz')
}
}
grails-app/views/my/foo.gsp
<html>
<head>
<title>Foo</title>
</head>
<body>
<a id="bar">Bar</a>
<g:each in="${0..100}"><br/></g:each>
<a id="baz">Baz</a>
</body>
</html>
С различными URL-адресами:
http://example.com/myapp/my/foo - doesn't scroll to an anchor
http://example.com/myapp/my/foo#baz - scrolls to the 'baz' anchor
http://example.com/myapp/my/quux - scrolls to the 'baz' anchor'
Нет никакого способа указать фрагмент непосредственно с помощью вызова рендеринга Grails, но в моем коде я использую обходной путь, который, кажется, обеспечивает большую часть желаемой функциональности только с небольшой дополнительной сложностью. Хитрость заключается в том, чтобы передать желаемую ссылку на фрагмент как часть модели, а затем воздействовать на эту ссылку на странице GSP. Таким образом, вызов рендеринга в моем контроллере выглядит так:
def foo() {
render(view : 'foo', model:[fragment:'myFragment'])
}
затем, в GSP, я получаю доступ к модели со следующим Javascript:
<g:javascript>
if ("${fragment}") {
window.location.href = "#${fragment}";
}
</g:javascript>
Затем GSP сообщит вашему браузеру перейти к нужной привязке на странице (если есть).