Grails: hộp kiểm không được đặt trở lại false


8

Tôi đang phát triển ứng dụng Grails (1.0.4) nơi tôi muốn chỉnh sửa tập hợp các bộ sưu tập trên một trang trong chế độ xem lưới. Tôi đã làm cho nó hoạt động khá tốt chỉ phụ thuộc vào việc xử lý tham số của Spring MVC, ngoại trừ một điều:

giá trị boolean (hoặc, cho rằng, Boolean) trong lưới có thể được đặt qua hộp kiểm, nhưng không được đặt , tức là khi tôi chọn hộp kiểm và cập nhật, giá trị được đặt thành true, nhưng sau đó khi tôi chỉnh sửa lại, hãy bỏ chọn hộp kiểm và cập nhật, nó vẫn đúng.

Đây là mã GSP của hộp kiểm:

<g:checkBox name="tage[${indexTag}].zuweisungen[${indexMitarb}].fixiert" value="${z.fixiert}" /> 

Và đây là HTML được tạo ra:

<input type="hidden" name="tage[0].zuweisungen[0]._fixiert" /> 
<input type="checkbox" name="tage[0].zuweisungen[0].fixiert" checked="checked" id="tage[0].zuweisungen[0].fixiert" /> 

Tôi đã tìm thấy một Grails bug mô tả chính xác những hiệu ứng này, nhưng nó được đánh dấu là cố định trong 1.0.2 và cơ chế vấn đề được mô tả ở đó (dấu gạch dưới trong tên trường ẩn được đặt ở vị trí sai) không có trong trường hợp của tôi.

Bất kỳ ý tưởng nào có thể là lý do?

1

Tôi sẽ tạo một ứng dụng mẫu nhỏ thể hiện sự cố và đính kèm nó vào lỗi Grails (hoặc tạo một lỗi mới). Một người nào đó ở đây có thể gỡ lỗi ứng dụng mẫu của bạn hoặc bạn sẽ thấy lỗi không thực sự cố định.

  0

Tôi nghĩ rằng bạn có nghĩa là 'hiển thị' thay vì 'tỏa sáng'. :-) 25 feb. 092009-02-25 20:35:04

  0

Quá lười biếng để làm điều đó ngay bây giờ :) Có lẽ là giải pháp dài hạn tốt nhất, mặc dù. 01 mar. 092009-03-01 13:00:26


1

Tôi nghĩ rằng cách giải quyết đơn giản nhất là đính kèm trình gỡ rối và xem tại sao Grails không điền giá trị. Xem xét Grails là mã nguồn mở, bạn sẽ có thể truy cập mã nguồn và khi bạn tìm ra giải pháp cho nó, bạn có thể vá phiên bản của mình.

Tôi cũng đã tìm thấy lỗi khác này GRAILS-2861 đề cập đến vấn đề liên quan đến ràng buộc với boolean (xem nhận xét của Marc trong chuỗi). Tôi đoán đó chính xác là vấn đề bạn đang mô tả.

  0

Thật không may, tất cả các phép thuật động và metaprogramming đang diễn ra trong grails làm cho nó gần như không thể gỡ lỗi trừ khi bạn biết chính xác nơi để tìm - có lẽ một nơi nào đó bên trong Spring MVC. mà tôi không thực sự biết. 01 mar. 092009-03-01 13:02:16

  0

Lỗi mà bạn liên kết là một vấn đề khác, tôi nghĩ - về cơ bản là một sự hiểu lầm dựa trên ý nghĩa khác nhau của thuộc tính "giá trị" trong HTML và grails. 01 mar. 092009-03-01 13:02:59

  0

Tôi phải thú nhận rằng tôi vẫn tin rằng hai điều này có liên quan :-). Bằng cách xem xét giải pháp bạn đã đăng bên dưới có vẻ như vấn đề là thực tế là ẩn hoặc hộp kiểm KHÔNG có giá trị được truyền khi biểu mẫu được gửi (được thảo luận trên vé). 01 mar. 092009-03-01 20:23:22

  0

Giải pháp bạn đang đăng giúp tôi nghĩ rằng bạn nên xem mã thẻ tùy chỉnh và xem lý do thuộc tính giá trị không được tạo. Một khi bạn sẽ có thuộc tính đó được viết bằng HTML, tôi cho rằng vấn đề này sẽ được sửa. 01 mar. 092009-03-01 20:24:47

  0

Tôi đang cố gắng để có được ý kiến ​​của Mr.G và Graeme về vấn đề này ở đây. 01 mar. 092009-03-01 20:29:47

  0

Không, vấn đề là HTML truyền không có gì cho một hộp kiểm bỏ chọn (đối với một hộp kiểm đã chọn, nó sử dụng "on" làm giá trị mặc định nếu không có giá trị nào được chỉ định). Trường ẩn là giải pháp cho điều đó. 02 mar. 092009-03-02 10:45:23

  0

Và theo như tôi hiểu, thuộc tính "giá trị" trong grails có nghĩa hoàn toàn khác với HTML - trong grails, nó xác định xem hộp kiểm trong biểu mẫu có nên được đặt hay không. Trong HTML, đó là chuỗi được gửi đến máy chủ nếu hộp kiểm đã được đặt. 02 mar. 092009-03-02 10:49:01

  0

@Michael: các hộp kiểm bỏ chọn KHÔNG truyền nếu không được kiểm tra (đó là hành vi bình thường của HTML), vì vậy nếu Grails dựa vào một số giá trị ở trong đó, tất cả những gì bạn cần làm là thêm một hàm javascript vào biểu mẫu của form mà đi qua form.elements và đặt giá trị ẩn cho những người bỏ lỡ nó. 02 mar. 092009-03-02 23:33:24

  0

Grails được cho là sử dụng trường ẩn để suy ra rằng hộp kiểm có cùng tên (sans underscore) không được chọn nếu nó không có trong tham số yêu cầu - hoạt động cho các trường thông thường, nhưng vì một số lý do không thành công với các trường được lập chỉ mục. 03 mar. 092009-03-03 00:28:31


0

Hãy thử điều này, thiết lập các bản ghi để DEBUG, But thử 3 đầu tiên nếu họ không thấy vấn đề lên, lật tất cả chúng để DEBUG:

codehaus.groovy.grails.web.servlet="error" // controllers 
codehaus.groovy.grails.web.pages="error" // GSP 
codehaus.groovy.grails.web.sitemesh="error" // layouts 
codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping 
codehaus.groovy.grails."web.mapping"="error" // URL mapping 
codehaus.groovy.grails.commons="info" // core/classloading 
codehaus.groovy.grails.plugins="error" // plugins 
codehaus.groovy.grails.orm.hibernate="error" // hibernate integration 

này sẽ cho phép bạn xem chính xác khi nào và cách cài đặt thông số bị lỗi và có thể tìm ra một công việc xung quanh.

  0

Unfortunatley, tôi không tìm thấy bất kỳ gợi ý có thể sử dụng nào trong nhật ký - nó không biết cách ánh xạ tham số "._fixiert", nhưng dĩ nhiên là không có trong mô hình miền, vì nó chỉ là dấu hiệu cho thấy sự vắng mặt của ".fixiert = on" có nghĩa là nó phải được đặt thành false. 01 mar. 092009-03-01 13:05:53


2

Đây là giải pháp của riêng tôi, về cơ bản một cách giải quyết điều đó bằng tay làm những gì các grails dữ liệu ràng buộc nên làm (nhưng không):

Map<String,String> checkboxes = params.findAll{def i = it.key.endsWith("._fixiert")} // all checkboxes 
checkboxes.each{ 
    String key = it.key.substring(0, it.key.indexOf("._fixiert")) 
    int tagIdx = Integer.parseInt(key.substring(key.indexOf('[')+1, key.indexOf(']'))) 
    int zuwIdx = Integer.parseInt(key.substring(key.lastIndexOf('[')+1, key.lastIndexOf(']'))) 
    if(params.get(key+".fixiert")) 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = true 
    } 
    else 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = false      
    } 
} 

trình, không đòi hỏi sự thay đổi trong grails chính nó, nhưng isn' t tái sử dụng (có thể có thể được thực hiện như vậy với một số công việc phụ).


3

Đây là giải pháp mà một chàng trai tên Julius Huang đã đề xuất trong danh sách gửi thư của người dùng grails. Nó có thể tái sử dụng nhưng dựa trên JavaScript để điền vào một trường ẩn với phản hồi "sai" cho một hộp kiểm được bỏ chọn mà không may là HTML không gửi.

Tôi hack GSP gửi "false" khi bỏ chọn hộp (true -> false) với tùy chỉnh TagLib.

Theo mặc định hộp kiểm không gửi gì khi bỏ chọn, vì vậy tôi sử dụng hộp kiểm làm xử lý sự kiện nhưng gửi trường ẩn thay thế.

"thông số" trong Bộ điều khiển có thể xử lý "sai" -> "true" mà không cần sửa đổi . ví dụ. Mọi thứ vẫn còn giống nhau trong Bộ điều khiển.

Custom Tag Cách sử dụng trong GSP (mẫu usedfunc_F là "true"),

<jh:checkBox name="surveyList[${i}].usedfunc_F" value="${survey.usedfunc_F}"></jh:checkBox> 

Dưới đây là những gì các Tag tạo,

<input type="hidden" name="surveyList[#{i}].usedfunc_F" id="surveyList[#{i}].usedfunc_F" value="false" /> 
<input type="checkbox" onclick="jhtoggle('surveyList[#{i}].usedfunc_F')" checked="checked" /> 

Các Javascript

<script type="text/javascript"> 
function jhtoggle(obj) { 
    var jht = document.getElementById(obj); 
    jht.value = (jht.value !='true' ? 'true' : 'false'); 
} 
</script>