2011-07-28 52 views
2

有沒有辦法使用render()與片段參數,所以頁面上自動加載它滾動到頁面的特定部分?類似於我們怎麼能叫grails呈現()與片段參數

redirect(controller: "book", action: "show", fragment: "profile") 

回答

2

你不能把它傳遞給render(),因爲當你實際上調用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> 

隨着各種網址:

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' 
+0

我現在不使用重定向()的原因是我需要保留模型。有沒有一個共同的解決方法?我想到的第一件事情是這樣的: 'code' 類{myController的高清 模型= [:] 高清富= { 渲染(視圖: '富',型號:型號) } 高清QUUX = { model.message = '你' 重定向(動作: '富',片段: '巴茲') } }'code' – Slavko

+0

@Slavko - 我想我看到你想要做什麼;我將不得不考慮一段時間。一個選項是使用會話來保存模型,但這不是很優雅。 –

+0

爲什麼第三個例子會滾動到'baz'錨? –

1

沒有辦法用上直接使用Grails呈現調用來直接定位片段,但在我的代碼中,我使用了一種解決方法,似乎只提供了大部分所需的功能,但只有一點額外的複雜性。訣竅是將所需的片段引用作爲模型的一部分傳入,然後在GSP頁面中對該引用進行操作。因此,在我的控制器的渲染調用看起來是這樣的:

def foo() { 
    render(view : 'foo', model:[fragment:'myFragment']) 
} 

然後,在普惠制下,我訪問模型以下JavaScript:然後

<g:javascript> 
    if ("${fragment}") { 
     window.location.href = "#${fragment}"; 
    } 
</g:javascript> 

普惠制將告訴您的瀏覽器跳轉到頁面中所需的錨點(如果有的話)。