我在保存/更新表格中的行时遇到问题。
我有一个方法 myBean.addRule 来动态地向表中添加新行。
这似乎工作正常....我点击它并在UI中出现一个新行以输入新数据。
但是当我保存 myBean.saveRules 时似乎出现了问题。
看起来只有最近添加的行被绑定到我的支持bean并更新。
例如,如果我有3行数据:
- 从第1行中删除一些文本并点击“保存”按钮,不保存此更新
- 如果我更改第3行的文本,则会保存此更改(最近添加的行)。
我是否在我的任何组件上都缺少一些绑定属性来修复此问题?
<a4j:repeat value="#{myBean.ruleSet}" var="rule" id="ruleIterator">
<h:dataTable value="#{rule}" var="currentRuleItem">
<h:column>
<h:panelGrid columns="2" cellspacing="5">
<h:outputLabel value="#{msg.FrequencyOfSpending}" />
<h:selectOneMenu id="ruleFrequencyOptions" value="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelected}" styleClass="commonSelect">
<f:selectItems value="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.validValues}" itemLabelEscaped="true" />
<f:ajax event="valueChange" listener="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelectedChange}" onerror="handleAjaxError" render="rulesGroup" />
</h:selectOneMenu>
</h:panelGrid>
<h:panelGroup id="rulesGroup">
<a4j:repeat value="#{currentRuleItem.ruleParams.Action.properties}" var="RuleParamProperty" id="budgetRuleIterator">
<h:panelGrid columns="4" cellspacing="5" columnClasses="ruleParamCheckbox, ruleParamAction, ruleParamActionFrequency, ruleParamActionInput">
<h:selectBooleanCheckbox value="#{RuleParamProperty.selected}" immediate="true">
<a4j:ajax event="click" listener="#{RuleParamProperty.selectedChange}" onerror="handleAjaxError" />
</h:selectBooleanCheckbox>
<h:outputText value="#{msg[RuleParamProperty.name]}" />
<h:panelGrid columns="3">
<h:outputText value="#{msg.Action_1}" />
<h:outputText value="#{msg[currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelected]}" class="italic-text" />
<h:outputText value="#{msg.Action_3}" />
</h:panelGrid>
<h:inputText value="#{RuleParamProperty.inputValue}" />
</h:panelGrid>
</a4j:repeat>
</h:panelGroup>
</h:column>
</h:dataTable>
<!--******* Link here to generate row with exact same format as all code above ***-->
<h:panelGrid columns="2">
<img id="AddIcon" src="#{facesContext.externalContext.requestContextPath}/images/icons/add.png" alt="#{msg.addControl}" />
<h:commandLink value="#{msg.addControl}" action="#{myBean.addRule}" />
</h:panelGrid>
</a4j:repeat>
<h:panelGrid columns="2" cellspacing="5">
<h:commandButton value="#{msg.sc_cancel}" immediate="true" action="#{myBean.cancel}" />
<h:commandButton value="#{msg.ua_save}" action="#{myBean.saveRules}" />
</h:panelGrid>
// my bean method
public void addRule()
{
iRuleSet.get("RuleControl1").add(createRule());
}
我没有包含我的支持bean代码,因为它非常复杂,如果需要,我可以编辑和显示代码段。
提前致谢
答案 0 :(得分:1)
好的,经过几个令人沮丧的时间阅读各种关于不同标签处理程序的文章(c:forEach,ui:include等)和组件(ui:repeat,h:datatable等等),它们之间的差异,混合和捣碎等可能引起的问题.........
这是固定的(我认为!)
我删除了所有 ui:repeat 并将其替换为Richfaces a4j:repeat ,这提供了额外的属性 keepSaved 。 我还删除了 h:dataTable ,并将其替换为 aj4:repeat 。
现在,对于我的生活,我无法找到任何解释 keepSaved 的内容! Richfaces 4 API Docs是正常的,可怕的! 它旁边的描述就像大多数属性一样......没有描述!
任何人都可以对这个组件属性的作用有所了解吗?
由于
解决方案:
<a4j:repeat value="#{myBean.ruleSet}" var="rule" id="ruleIterator">
<a4j:repeat value="#{rule}" var="currentRuleItem">
<h:column>
<h:panelGrid columns="2" cellspacing="5">
<h:outputLabel value="#{msg.FrequencyOfSpending}" />
<h:selectOneMenu id="ruleFrequencyOptions" value="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelected}" styleClass="commonSelect">
<f:selectItems value="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.validValues}" itemLabelEscaped="true" />
<f:ajax event="valueChange" listener="#{currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelectedChange}" onerror="handleAjaxError" render="rulesGroup" />
</h:selectOneMenu>
</h:panelGrid>
<h:panelGroup id="rulesGroup">
<a4j:repeat value="#{currentRuleItem.ruleParams.Action.properties}" var="RuleParamProperty" id="budgetRuleIterator" keepSaved="true">
<h:panelGrid columns="4" cellspacing="5" columnClasses="ruleParamCheckbox, ruleParamAction, ruleParamActionFrequency, ruleParamActionInput">
<h:selectBooleanCheckbox value="#{RuleParamProperty.selected}" immediate="true">
<a4j:ajax event="click" listener="#{RuleParamProperty.selectedChange}" onerror="handleAjaxError" />
</h:selectBooleanCheckbox>
<h:outputText value="#{msg[RuleParamProperty.name]}" />
<h:panelGrid columns="3">
<h:outputText value="#{msg.Action_1}" />
<h:outputText value="#{msg[currentRuleItem.ruleControls.ControlOne.controlParams.Period.valueSelected]}" class="italic-text" />
<h:outputText value="#{msg.Action_3}" />
</h:panelGrid>
<h:inputText value="#{RuleParamProperty.inputValue}" />
</h:panelGrid>
</a4j:repeat>
</h:panelGroup>
</h:column>
</a4j:repeat>
<!--******* Link here to generate row with exact same format as all code above ***-->
<h:panelGrid columns="2">
<img id="AddIcon" src="#{facesContext.externalContext.requestContextPath}/images/icons/add.png" alt="#{msg.addControl}" />
<a4j:commandLink value="#{msg.addControl}" action="#{myBean.addRule}">
<f:param name="ruleType" value="BudgetRule" />
</a4j:commandLink>
</h:panelGrid>
</a4j:repeat>
<h:panelGrid columns="2" cellspacing="5">
<h:commandButton value="#{msg.sc_cancel}" immediate="true" action="#{myBean.cancel}" />
<h:commandButton value="#{msg.ua_save}" action="#{myBean.saveRules}" />
</h:panelGrid>
// my bean method
public void addRule()
{
iRuleSet.get("RuleControl1").add(createRule());
}