2014-03-04 37 views
0

我需要在grails中創建一個動態表單,它在運行時有各種動態創建的輸入框,然後將其參數提交給控制器,就像在編譯時創建的表單一樣。有任何想法嗎?grails:如何動態構建表單?

視圖GSP可能是這樣的:

<g:form controller="report" action="view">   
    <input type="submit" value="Submit"> 
    <!-- insert some inuput params here at runtime --> 
</g:form> 

和動作控制器將是:

class ReportController { 
def view = { 
    def someDynamicParam = "someParam" 
    if (params["someParam"] != null) { 
     ... 
    } 

問題是我不知道如何來渲染表單輸入字段的方式Grails會在提交時理解它們。

+1

運行'grails install-templates'並查看用於生成腳手架視圖的腳本。那裏可能會有一兩個暗示。 – zoran119

+0

你想在哪裏創建輸入字段 - 在客戶端瀏覽器還是在服務器端?因此請分別查看zoran119的評論或Sérgio的回答 – aldrin

回答

1

我會做類似

<g:form controller="report" action="view">   
    <input type="submit" value="Submit"> 
    <g:if test="${checkIfParamsExists}"> 
    <input type="text" id="newParamName"/> 
    </g:if> 
</g:form> 

並在控制器端,你的代碼應該工作正常。

+0

我明白了,非常感謝。作爲第二個問題,我認爲我還需要添加JavaScript來進行任何客戶端驗證,例如檢查他們沒有鍵入一個數字類型的輸入字符。如果我在服務器端進行了這項檢查,它太晚了,因爲我無法顯示輸入表單的哪一部分出現錯誤,因爲它已被提交,並且我將在新頁面上結束。 –

+0

生成表單grails也會根據所使用的域生成所有客戶端驗證。因此,在生成表單之後,只需複製所需參數的一部分,然後將其粘貼到g:if部分中。表格部分看起來像這樣(您需要爲每個參數複製此部分)

\t \t

1

要創建動態輸入,您需要JavaScript。我建議你使用一些框架來使它更容易。以JQuery爲例:

$('<input>').attr({ 
    type: 'text', 
    id: 'foo', 
    name: 'foo' 
}).appendTo('form'); 

然後你需要考慮如何將它綁定到一個Domain Class。看着你的問題我不能看你需要什麼,但讓我們做一個例子,其中用戶可設定值:

//domain class 
class MyDomainClass { 
    String value 
} 

//javascript to add a new value 
$('<input>').attr({ 
    type: 'text', 
    name: 'values' 
}).appendTo('form'); 

//controller submit action 
class MyController { 
    def save() { 
    def values = params.list('values') //get the list of values 
    values.each { 
     MyDomain instance = new MyDomain(value: it) 
     instance.save() 
    } 
    } 
} 

這裏的關鍵是使用你的HTML一樣name,並使用params.list()改造列表中的子值。

+0

您不需要* javascript。這只是一種方法。他可以寫一個標籤庫來提供幫助。或者只是在GSP上有一些迭代和條件邏輯。 JavaScript可能是我動態表單的最後一招。 – Gregg

+0

對,我認爲OP想要一個按鈕「添加更多」來創建新的輸入。如果只是爲了檢查是否需要顯示某些輸入,我同意你的看法。 –