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 сообщит вашему браузеру перейти к нужной привязке на странице (если есть).

Другие вопросы по тегам