2010-05-30 72 views
6

我在關聯類中綁定布爾屬性時遇到了問題。屬性設置爲true如果我選中複選框(好),但是null如果未選中checbox。Grails複選框

我知道HTML複選框的問題。我知道爲什麼在params中發送「_fieldName」,但是這個「_fieldName」不會將我的布爾屬性設置爲false

class Person{ 
    String title 

    List<Group> groups = new ArrayList() 
    static hasMany = [groups: Groups]  
} 

class Group{ 
    String title 
    Boolean isHidden 

    static belongTo = Person 
} 

class PersonController{ 

    def form = { 
     def person = new Person() 
     person.groups.add(new Group())  
     return ["person": person] 
    } 

    def handleForm = { 
     def person = new Person(params) 
     println person.groups[0] 
    } 
} 


<g:form action="save"> 
    <g:textField name="title" value="${person?.title}" /> 
    <g:textField name="groups[0].title" value="${person?.groups[0]?.title}"/> 
    <g:checkBox name="groups[0].isHidden" value="${person?.groups[0]?.isHidden}" /> 
    <g:submitButton name="save" value="Save" /> 
    </g:form> 

如果我檢查複選框:
[是否隱藏:上,標題:,_isHidden:]
的println person.groups [0] //真正

如果我不檢查複選框:
[標題:一個,_isHidden:]
的println person.groups [0] //



非常感謝您的幫助
Tom
對不起,我搜索了這個網頁,但沒有得到我麻煩的實際信息。

+0

一些GSP代碼在這裏很有用。 – 2010-05-30 22:54:38

+0

嗨斯科特,我附加了GSP代碼。謝謝 Tom – 2010-05-31 05:48:17

+0

這個bug還沒有在grails github repo上修補:https://github.com/grails/grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/ groovy/grails/plugins/web/taglib/FormTagLib.groovy這讓我瘋狂! – 2012-03-01 15:09:20

回答

5

我改正複選框標籤。感謝gid的幫助,現在它也適用於關聯。

從源:
http://grails.org/doc/latest/ref/Tags/checkBox.html#

if (value == null) value = false 

out << "<input type=\"hidden\" name=\"_${name}\" /><input type=\"checkbox\" name=\"${name}\" " 

if (value && checked) { out << 'checked="checked" ' } 

到:

if (value == null) value = false 

def begin = name.lastIndexOf('.') +1 
def tail = name.substring(begin); 
out << "<input type=\"hidden\" name=\"${name.replace( tail, "_" + tail )}\" /><input type=\"checkbox\" name=\"${name}\" " 

if (value && checked) { out << 'checked="checked" ' } 
+0

好東西..我會看看我是否可以爲grails項目創建一個測試和補丁 – 2010-05-31 18:19:51

+0

好東西,非常感謝 – Thermech 2013-03-21 18:41:39

+0

謝謝這有助於很多,我不相信他們還沒有解決這個問題。我不得不稍微調整一下源代碼。但總體思路是有效的。您需要更新隱藏字段的名稱。 – Nix 2013-06-05 17:17:38

5

很多黑客看來,答案之後是Grails是尋找與名稱的標記字段:

groups[0]._isHidden 

而不是

_groups[0].isHidden 

這實際上是g:checkBox標籤產生什麼。見GrailsDataBinder.java:911看到propertyStartsWithFieldMarkerPrefix(PV的PropertyValue,字符串fieldMarkerPrefix)確認

如果你有興趣,我上傳了這個問題,測試項目gitub.com

+0

非常感謝。 Tom – 2010-05-31 05:35:32

0

設置複選框爲「假」的默認值,它應該解決的問題。 希望它有幫助。