2009-02-22 92 views
8

我正在開發Grails(1.0.4)應用程序,我想在網格視圖的單個頁面上編輯集合的集合。根據Spring MVC的索引參數處理,我得到它工作得很好,除了一件事:Grails:複選框未被設置爲false

網格中的布爾值(或者對於布爾值)可以通過複選框設置,但不能取消設置,即當我檢查複選框並更新時,該值設置爲true,但之後當我再次編輯時,取消選中複選框並更新,它仍然爲true。

這是複選框的GSP代碼:

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

這是生成的HTML:我發現一個Grails bug描述的正是這種效果

<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" /> 

,但它的在1.0.2中標記爲固定,並且在那裏描述的問題機制(隱藏字段名稱下劃線放在錯誤的地方)在我的情況下不存在。

任何想法可能是什麼原因?

回答

1

我會創建一個小示例應用程序,演示問題並將其附加到Grails錯誤(或創建一個新的應用程序)。這裏有人可能能夠調試您的示例應用程序,或者您將顯示該錯誤未被修復。

+0

我認爲你的意思是'顯示'而不是'閃光'。 :-) – 2009-02-25 20:35:04

+0

現在太懶了:)可能是最好的長期解決方案。 – 2009-03-01 13:00:26

1

我認爲最簡單的解決辦法是附加一個調試器,看看爲什麼Grails無法填充該值。考慮到Grails是開源的,你可以訪問源代碼,一旦你找出解決方案,你可以修補你的版本。

我還發現了其他的bug GRAILS-2861,它提到了綁定到布爾值的問題(請參閱Marc在線程中的註釋)。我想這正是你所描述的問題。

+0

不幸的是,所有在grails中進行的動態和元編程魔術都使得調試幾乎不可能,除非您確切地知道在哪裏尋找 - 可能在Spring MVC內的某處。我不知道。 – 2009-03-01 13:02:16

0

嘗試了這一點,設置日誌調試,弗里斯特嘗試第3,如果他們不顯示的問題時,他們都翻轉到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 

這應該讓你看到什麼時候以及參數設置如何失敗並可能找出解決方法。

2

這是我自己的解決方案,基本上是一個變通方法,手動做什麼數據綁定Grails的應該做的事(但沒有):

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      
    } 
} 

作品,需要的Grails本身沒有變化,但是,這不是」不可重用(可能會做一些額外的工作)。

3

這是一個名叫Julius Huang的人在grails-user郵件列表中提出的解決方案。它是可重用的,但依賴於JavaScript來填充一個隱藏的字段,其中包含一個未選中的複選框的「false」響應,該複選框很遺憾不會發送。

我砍GSP送「假」時 取消選中該複選框(真 - >假)與 自定義標籤庫。

默認情況下,當複選框取消選中 ,所以我用的複選框作爲 事件處理程序,但發送隱藏字段 ,而不是沒有任何響應。

控制器中的「params」可以處理 「false」 - >「true」,不需要修改任何 。例如。控制器中的所有內容仍爲 。

在GSP自定義標記的使用(樣品usedfunc_F是 「真」),

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

這裏是標籤產生什麼,

<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" /> 

JavaScript的

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