2

私は、更新されたすべてのセルをキャプチャして(保存を高速化するために)動的テーブルを作成し、保存後にそれらのセルを更新/再レンダリングすることに取り組んでいます。

これまでのところ、テーブルが作成されており、更新されたすべてのアイテムが ajax リスナーを介して非常にうまくキャプチャされていますが、保存後に更新されたコンポーネントを更新/再レンダリングできないという問題が発生しています。

ページのコード スニペット:

<h:form id="formMain" prependId="false">
  <div id="contentWrapper">
    <p:messages id="messages" severity="warn, error" autoUpdate="true" closable="true" />
    <div style="float:right; position:relative; top: -3px;">
      <h:commandButton id="btnSaveUpdates" styleClass="save_updates_button">
        <f:ajax execute="@this" listener="#{remediationDetail.processUpdates}"/>
      </h:commandButton>
     </div>
   <h:panelGroup id="detailEdit" styleClass="clear_left" layout="block">
     <h:dataTable id="tblDetails" styleClass="slate_table remediation" value="#{remediationDetail.details}" var="dataItem">
                    <c:forEach items="#{remediationDetail.detailHeaders}" var="key" varStatus="looper">
                    <h:column>
                        <f:facet name="header">#{key.fieldDefinition.fieldConfiguration.customLabel}</f:facet>
                      <c:if test="#{key.fieldDefinition.dataType.name eq 'Number'}">
                        <h:panelGroup id="detailNumberPanel#{looper.index}">
                            <h:inputText id="txtDetailNumber#{looper.index}" rendered="#{remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}" styleClass="remediation_textbox error_marker" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}">
                                            <f:convertNumber maxFractionDigits="0" maxIntegerDigits="19"/>
                                            <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                            <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:inputText>
                                        <h:outputText id="txtDetailNumberOut#{looper.index}" rendered="#{not remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}"></h:outputText>
                                    </h:panelGroup>
                              </c:if>
                      <c:if test="#{key.fieldDefinition.dataType.name eq 'Decimal'}">
                        <h:panelGroup id="detailDecimalPanel#{looper.index}">
                            <h:inputText id="txtDetailDecimal#{looper.index}" rendered="#{remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" converterMessage="Value provided is not a valid Decimal" styleClass="remediation_textbox error_marker" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}">
                                            <f:convertNumber maxFractionDigits="2" maxIntegerDigits="19"/>
                                            <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                            <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:inputText>
                                        <h:outputText id="txtDetailDecimalOut#{looper.index}" rendered="#{not remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}">
                                            <f:convertNumber maxFractionDigits="2" maxIntegerDigits="19"/>
                                        </h:outputText>
                                    </h:panelGroup>
                            </c:if>
                      <c:if test="#{key.fieldDefinition.dataType.name eq 'Date'}">
                        <h:panelGroup id="detailDatePanel#{looper.index}">
                                        <h:inputText id="txtDetailDate#{looper.index}" rendered="#{remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" styleClass="remediation_textbox error_marker dates" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}">
                                            <f:convertDateTime locale="en_US" pattern="MM/dd/yyyy" />
                                            <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                            <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:inputText>
                                        <h:outputText id="txtDetailDateOut#{looper.index}" rendered="#{not remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}">
                                            <f:convertDateTime locale="en_US" pattern="MM/dd/yyyy" />
                                        </h:outputText>
                                    </h:panelGroup>
                      </c:if>
                      <c:if test="#{key.fieldDefinition.dataType.name eq 'Boolean'}">
                        <h:panelGroup id="detailBooleanPanel#{looper.index}">
                            <h:selectBooleanCheckbox id="cbDetailBooleanInput#{looper.index}" rendered="#{remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}">
                                <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                            <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:selectBooleanCheckbox>
                            <h:outputText id="txtDetailBooleanOutput#{looper.index}" rendered="#{not remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}"></h:outputText>
                        </h:panelGroup>
                            </c:if>
                      <c:if test="#{key.fieldDefinition.dataType.name eq 'String'}">
                        <h:panelGroup id="detailStringPanel#{looper.index}">
                                <h:inputText id="txtDetailString#{looper.index}" rendered="#{key.fieldDefinition.inputType eq 'TEXTBOX' and remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}" styleClass="remediation_textbox error_marker" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}">
                                            <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                            <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:inputText>
                                        <h:selectOneMenu id="ddDetailString#{looper.index}" styleClass="remediation_select error_marker" rendered="#{key.fieldDefinition.inputType eq 'DROPDOWN' and remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}" title="#{remediationDetail.errorMessages(dataItem.id, key.fieldDefinition.id)}">
                                             <f:selectItems value="#{dataItem.entityList[looper.index].fieldDefinition.listItemSet.selectItemsList}"></f:selectItems>
                                             <f:ajax event="change" execute="@this" render="@none" listener="#{remediationDetail.markChangedEntity}"/>
                                             <f:attribute name="entity" value="#{dataItem.entityList[looper.index]}"/>
                                        </h:selectOneMenu>
                                        <h:outputText id="txtDetailStringOut#{looper.index}" rendered="#{not remediationDetail.containsErrors(dataItem.id, key.fieldDefinition.id)}" value="#{dataItem.entityList[looper.index].val}"></h:outputText>
                                    </h:panelGroup>
                      </c:if>
                    </h:column> 
                    </c:forEach>
                </h:dataTable>
            </h:panelGroup>
        </div>
    </h:form>

バッキング Bean からのコード

@ManagedBean
@SessionScoped
public class RemediationDetail implements Serializable {
public void markChangedEntity(AjaxBehaviorEvent ajaxEvent){
    Entity entity = (Entity) Utility.getAjaxActionAttribute(ajaxEvent, "entity");
    //Capture the Client Ids that were updated
    getComponentsIdsToRefresh().add(ajaxEvent.getComponent().getParent().getClientId());
    //Capture what Entities were changed    
    getChangedEntities().add(entity);
}

 //This is where the save happens and hoping for updating of components !!
 public void processUpdates(AjaxBehaviorEvent event){
    entityDomain.processEntities(changedEntities);

    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().addAll(getComponentsIdsToRefresh());
}

}

保存が行われた後、更新するクライアント ID を PartialViewContext().getRenderIds() に追加しましたが、何も更新されていません。OmniFaces Ajax.Update(clientId) も試しましたが、成功しませんでした。

現在構築中の完全なテーブルに対応しているため、コード スニペットを更新しました。

私の質問は次のとおりです。

  1. 私がやっていることは可能ですか?
  2. コンポーネントのレンダリングに正しく取り組んでいますか?
  3. 私は何が欠けていますか?

私の環境: Mojarra 2.1.7 Tomcat 7.022

よろしく、

マイク

4

2 に答える 2