【发布时间】:2014-03-20 08:13:34
【问题描述】:
今天,我正在解决 JSF 中的一个小问题。实际上,我的xhtml 页面上有一个InputText,readyOnly 属性设置为true。要求是单击布尔值checkbox,我应该使输入文本可编辑,这意味着readyOnly false。代码有点像这样。
<div class="div-form-col" >
<h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" />
<h:inputText value="#{outpassMBean.violationWebDTO.violationAmount}" id="violationAmt" readonly="true"/>
</div>
<div class="div-form-row">
<div class="div-form-col">
<h:outputLabel value="#{msgs.violationExemptionApplicable} " for="violationExempted" />
<h:selectBooleanCheckbox value="#{outpassMBean.violationWebDTO.violationExemptionApplicable}" id="violationExempted" onchange="makeViolationAmountEditable(this);">
</h:selectBooleanCheckbox>
</div>
</div>
该方法的脚本如下:-
function makeViolationAmountEditable(id){
alert("Ben");
document.getElementById('violationAmt' ).readOnly=false;
alert("Done");
}
现在我的第一个问题是,如果我正在编辑文本字段中的值,我如何更新 backing bean 中的violationAmt 值。什么是最好的方法?当我使用 PrimeFaces 时,我遇到了 remoteCommand 概念。所以这是我添加的内容。
<p:remoteCommand name="makeViolationAmountEditableOnServer" action="#{outpassMBean.makeViolationAmountEditable}" update="amountPanelApplicant"/>
backing bean 级别的方法是这样的
public void makeViolationAmountEditable(){
//Set updated value
setUpdatedViolationAmount(violationWebDTO.getViolationAmount());
//Some other code.
}
问题是,每当运行此代码时,违规WebDTO 中的违规量是旧的,而不是我在使输入字段可编辑后输入的量。尽管我在萤火虫中看到更新的值是请求的一部分,但在支持 bean 中,但是仍然引用了旧值。我不明白为什么?
我的前辈告诉我,您正在客户端而不是服务器端更新 readOnly 的值,并更新了我的代码类似这样。
<p:outputPanel id="amountPanelApplicant">
<p:outputPanel rendered="#{outpassMBean.violationWebDTO.violationForCmb eq 2 and outpassMBean.violationWebDTO.isViolationExists}">
<p:outputPanel styleClass="div-form twoCol">
<div class="div-form-row">
<div class="div-form-col" >
<h:outputLabel value="#{msgs.violationAmount} " for="violationAmt" />
<h:inputText value="#{outpassMBean.violationWebDTO.violationAmount}" id="violationAmt" readonly="#{outpassMBean.violationAmtEditable}">
</h:inputText>
</div>
<div class="div-form-col">
<h:outputLabel value="#{msgs.outPayTot} " for="totalViolationAmount" />
<h:outputLabel styleClass="readOnly" value="#{outpassMBean.violationWebDTO.totalViolationAmount}" id="totalViolationAmount" />
</div>
</div>
</p:outputPanel>
<p:outputPanel styleClass="div-form twoCol" rendered="#{outpassMBean.outpassApplication.applicationSubType.id eq 2 }" >
<div class="div-form-row">
<div class="div-form-col">
<h:outputLabel value="#{msgs.violationExemptionApplicable} " for="violationExempted" />
<h:selectBooleanCheckbox value="#{outpassMBean.violationWebDTO.violationExemptionApplicable}" id="violationExempted" onchange="makeViolationAmountEditableOnServer();">
</h:selectBooleanCheckbox>
<p:remoteCommand name="makeViolationAmountEditableOnServer" action="#{outpassMBean.makeViolationAmountEditable}" update="amountPanelApplicant"/>
</div>
</div>
</p:outputPanel>
</p:outputPanel>
public void makeViolationAmountEditable(){
if(logger.isDebugEnabled()){
logger.debug("Inside makeViolationAmountEditable...");
}
//setting violation amount editable flag
setViolationAmtEditable(false);
//Preserving original and total amount.
setOriginalViolationAmt(violationWebDTO.getViolationAmount());
setOriginalTotalViolationAmount(violationWebDTO.getTotalViolationAmount());
}
在上面更新的代码中,没有调用 javascript。 readyOnly 值从支持 bean 本身设置为 true 和 false。这次更新之后,基本上新的编辑值在violationWebDTO中更新了。
谁能解释一下?为什么不在第一个快照中?这不是一个完整的代码,但我试图解释混乱。任何指针都会有所帮助。
【问题讨论】:
-
在以后的问题中,请尝试仅发布相关代码。当然,当您删除那些
<div>、<h:outputLabel>等标签时,问题并没有消失。那就让他们出去吧! -
@BalusC,我肯定会使用您提供的指南。我只是理解答案,如果我发现更多困惑,我会更新你。
标签: jsf primefaces