2013-01-21 29 views
0

嘗試存儲在隱藏輸入表的lenght爲的JavaScript當我有javax.el.PropertyNotWritableExceptionPropertyNotWritableException時做FN:長度

Caused by: javax.el.PropertyNotWritableException: /view/ci/buttons.xhtml at line 34 and column 73 value="#{fn:length(order.phases)}": Illegal Syntax for Set Operation 
    at org.apache.myfaces.view.facelets.el.TagValueExpression.setValue(TagValueExpression.java:125) 

的JSF:

<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/> 

我不不明白,錯誤,FN:長度支持只讀操作,或者我失去了一些東西?

+0

只需將'

+0

如果您只想將它​​用於JavaScript,請將「」從任何「」移出,否則它將不會被髮送到表單。 –

回答

3

此行爲是完全預期的。 <h:inputHidden>也通過表單提交進行處理。這允許通過JavaScript處理隱藏值。但是,EL函數調用不是有效的setter方法操作。因此這個例外。與其他每個UIInput組件一樣,該值必須是一個完整的bean屬性。

鑑於將變量傳遞給JavaScript的具體功能要求,<h:inputHidden>實際上是該作業的錯誤工具。只要讓JSF打印出來,就好像它是一個JS變量,而不是:

<script>var phasesCount = #{fn:length(order.phases)};</script> 

或者,如果你真的需要一個隱藏的輸入元素,即使它在服務器端沒有完全的使用,則使用普通的HTML元素而不是:

<input type="hidden" id="phasesCount" value="#{fn:length(order.phases)}" /> 

要注意,可以作爲良好的使用完全任意的HTML元素或屬性同樣的工作:

<div id="phasesCount" data-phasesCount="#{fn:length(order.phases)}"> 

ŧ他的價值也可以通過JS的方式獲得。

+0

哦,是的,我已經用腳本做了快速的解決方法(沒有完全控制,當它將刷新並部分提交和刷新時啓動),但我忘記只是嘗試'正常'html輸入:) –

+0

不客氣。您可以使用'或''在每個ajax請求上自動重新執行腳本。 – BalusC

0
<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/> 

inputHiddeninput control。提交表單時,JSF將嘗試在此表達式上調用setValue

+0

??這正是我發佈的代碼並且不起作用 –

+0

@McDowell意味着JSF在發現綁定到託管bean屬性時試圖編寫您的屬性,但它是一個函數。 –

+0

@lechlukasz我還沒有發佈解決方案,我已經解釋了爲什麼會出現錯誤 - 您只能在輸入控件中使用可編輯的屬性綁定。 – McDowell