0

我在保存/更新表中的行时遇到问题。

我有一个方法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 代码,因为它非常复杂,如果需要,我可以编辑和显示片段。

提前致谢

4

1 回答 1

1

好吧,在阅读了关于不同标签处理程序(c:forEach、ui:include 等)和组件(ui:repeat、h:datatable 等)的各种文章之后,经过许多令人沮丧的时间,它们之间的差异,问题可能来自混合和捣碎它们等......

它是固定的(我认为!)

我删除了所有我的ui:repeat并用 Richfaces a4j:repeat替换它们,它提供了附加属性keepSaved。我还删除了我的h:dataTable并将其替换为aj4:repeat

现在对于我的生活,我找不到任何地方可以解释keepSaved的作用!!Richfaces 4 API 文档
和往常一样,很可怕! 它旁边的描述就像大多数属性一样......没有描述!

任何人都可以对这个组件属性的作用有所了解吗?

谢谢

解决方案:

<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());     
}
于 2012-07-26T16:04:41.577 回答