2010-05-30 12 views
6

Ich habe Probleme mit der Bindung der booleschen Eigenschaft in Assoziationsklassen. Property ist auf True gesetzt, wenn ich Kontrollkästchen (gut), aber null ist, wenn Checbox nicht überprüft wird.Grails Kontrollkästchen

Ich kenne das Problem mit HTML-Kontrollkästchen. Ich weiß, warum "_fieldName" in params sendet, aber dieser "_fieldName" legt meine boolesche Eigenschaft nicht auf false fest.

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> 

Wenn ich überprüfen Checkbox:
[isHidden: auf, Titel: a, _isHidden:]
println person.groups [0] // true

Wenn ich check don:
[title: a, _isHidden:]
println person.groups [0] // null



Vielen Dank für die Hilfe Tom
Es tut mir leid, ich suchte dieses Web, aber nicht die tatsächlichen Informationen für meine Probleme.

+0

Einige GSP-Code könnte hier nützlich sein. –

+0

Hallo Scott, ich füge GSP-Code an. Danke Tom –

+0

Dieser Fehler wurde nicht auf die Grails Github Repo gepatcht: https://github.com/grails/grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/ groovy/grails/plugins/web/taglib/FormTagLib.groovy das hat mich verrückt gemacht !! –

Antwort

5

ich korrigieren Checkbox-Tag. Dank gid help funktioniert es jetzt auch mit Assoziationen.

von Quelle:
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" ' } 

zu:

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

gute Sachen .. Ich werde sehen, ob ich einen Test und Patch für das Grails-Projekt erstellen kann –

+0

Schöne Sachen, vielen Dank – Thermech

+0

Vielen Dank das hilft viel, ich kann nicht glauben, dass sie das noch nicht behoben haben. Ich musste die Quelle ein wenig anpassen. Aber die allgemeine Idee funktioniert. Sie müssen den Namen des versteckten Feldes aktualisieren. – Nix

5

Nach vielen Hacking es die Antwort erscheint, ist, dass Grails ist für ein Markerfeld mit dem Namen suchen:

groups[0]._isHidden 

statt

_groups[0].isHidden 

was eigentlich ist, was der g:checkBox Tag erzeugt. Siehe GrailsDataBinder.java:911 siehe propertyStartsWithFieldMarkerPrefix (Property pv, String fieldMarkerPrefix) zur Bestätigung

Wenn Sie interessiert sind ich das Testprojekt für diese Frage hochgeladen haben zu gitub.com

+0

Vielen Dank. Tom –

0

den Standardwert der Check-Box auf "false", und es soll das Problem lösen. Hoffe es hilft.

Verwandte Themen