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を削除し、追加の属性keepSavedを提供するRichfaces a4j:repeatに置き換えました。また、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 に答える