2012-07-25 76 views
0

我在保存/更新表中的行時遇到問題。
JSF2 h:dataTable動態生成的行不綁定到後臺bean

我有一個方法myBean.addRule動態添加新行到表中。
這似乎工作正常....我點擊它,一個新的行出現在界面輸入新的數據。

但是,當我保存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代碼,這是非常複雜的,如果需要的話我可以編輯和節目片段。

在此先感謝

回答

1

好了,所以經過多次折騰幾個小時來閱讀各種關於不同的標籤處理器的文章(C:的forEach,用戶界面:包括等)和組件(UI:重複,H:數據表等。 。),它們之間的區別,可以從混合搗碎他們,等出現的問題.........

它是固定的(我想!)

我刪除我所有的用戶界面:重複並用RichFaces的取而代之A4J:重複其提供了附加的屬性keepSaved。 我也打消了我的H:dataTable的AJ4替代它:重複

現在我用我的生命,我找不到任何地方,說明什麼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());  
} 
相關問題