2010-05-30 23 views
6

Tôi gặp rắc rối với việc ràng buộc thuộc tính Boolean trong các lớp kết hợp. Thuộc tính được đặt thành đúng nếu tôi chọn hộp kiểm (tốt), nhưng là null nếu checbox không được chọn.Grails checkbox

Tôi biết sự cố với hộp kiểm HTML. Tôi biết tại sao gửi "_fieldName" trong thông số, nhưng "_fieldName" này không đặt thuộc tính boolean của tôi thành 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> 

Nếu tôi kiểm tra hộp kiểm:
[Được ẩn: trên, tiêu đề: a, _isHidden:]
person.groups println [0] // true

Nếu tôi không kiểm tra hộp kiểm:
[title: a, _isHidden:]
person.groups println [0] // rỗng



Cảm ơn rất nhiều sự giúp đỡ
Tom
Tôi rất tiếc, tôi đã tìm kiếm trên web này nhưng không nhận được thông tin thực sự về sự cố của tôi.

+0

Một số mã GSP có thể hữu ích ở đây. –

+0

Xin chào, tôi đã thêm mã GSP. Cảm ơn Tom –

+0

Lỗi này chưa được vá trên repils github grails: https://github.com/grails/grails-core/blob/master/grails-plugin-gsp/src/main/groovy/org/codehaus/ groovy/grails/plugins/web/taglib/FormTagLib.groovy điều này đã khiến tôi phát điên! –

Trả lời

5

tôi sửa tag hộp kiểm. Nhờ giúp đỡ gid, bây giờ nó làm việc với hiệp hội quá.

từ nguồn:
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" ' } 

tới:

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

công cụ hay .. Tôi sẽ xem liệu tôi có thể tạo thử nghiệm và vá cho dự án grails –

+0

Công cụ hay không, cảm ơn rất nhiều – Thermech

+0

Cảm ơn điều này rất nhiều, tôi không thể tin rằng họ chưa sửa lỗi này. Tôi đã phải tinh chỉnh nguồn một chút. Nhưng ý tưởng chung hoạt động. Bạn cần phải cập nhật tên của trường ẩn. – Nix

5

Sau nhiều hack nó xuất hiện câu trả lời là grails đang tìm kiếm một lĩnh vực đánh dấu với tên:

groups[0]._isHidden 

hơn

_groups[0].isHidden 

mà thực sự là những gì các thẻ g:checkBox tạo ra. Xem GrailsDataBinder.java:911 thấy propertyStartsWithFieldMarkerPrefix (PropertyValue pv, String fieldMarkerPrefix) để xác nhận

Nếu bạn quan tâm tôi đã tải lên các dự án thử nghiệm cho câu hỏi này để gitub.com

+0

Cảm ơn rất nhiều. Tom –

0

Thiết lập giá trị mặc định của hộp kiểm "false", và nó sẽ giải quyết vấn đề này. Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan